forked from Imagelibrary/rtems
2011-04-16 Chris Johns <chrisj@rtems.org>
PR 1774/filesystem
* libfs/src/imfs/imfs_eval.c: Fix the IMFS eval and eval for make
handlers to not inspect a mounted file sytems path.
This commit is contained in:
@@ -1,3 +1,9 @@
|
|||||||
|
2011-04-16 Chris Johns <chrisj@rtems.org>
|
||||||
|
|
||||||
|
PR 1774/filesystem
|
||||||
|
* libfs/src/imfs/imfs_eval.c: Fix the IMFS eval and eval for make
|
||||||
|
handlers to not inspect a mounted file sytems path.
|
||||||
|
|
||||||
2011-04-04 Sebastien Bourdeauducq <sebastien.bourdeauducq@gmail.com>
|
2011-04-04 Sebastien Bourdeauducq <sebastien.bourdeauducq@gmail.com>
|
||||||
|
|
||||||
PR 1722/networking
|
PR 1722/networking
|
||||||
|
|||||||
@@ -306,6 +306,7 @@ int IMFS_evaluate_for_make(
|
|||||||
* Get the path length.
|
* Get the path length.
|
||||||
*/
|
*/
|
||||||
pathlen = strlen( path );
|
pathlen = strlen( path );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Evaluate all tokens until we are done or an error occurs.
|
* Evaluate all tokens until we are done or an error occurs.
|
||||||
*/
|
*/
|
||||||
@@ -335,56 +336,58 @@ int IMFS_evaluate_for_make(
|
|||||||
case IMFS_UP_DIR:
|
case IMFS_UP_DIR:
|
||||||
/*
|
/*
|
||||||
* Am I at the root of all filesystems? (chroot'ed?)
|
* Am I at the root of all filesystems? (chroot'ed?)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ( pathloc->node_access == rtems_filesystem_root.node_access )
|
if ( pathloc->node_access == rtems_filesystem_root.node_access )
|
||||||
break; /* Throw out the .. in this case */
|
break; /* Throw out the .. in this case */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Am I at the root of this mounted filesystem?
|
* Am I at the root of this mounted filesystem?
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access){
|
if (pathloc->node_access ==
|
||||||
|
pathloc->mt_entry->mt_fs_root.node_access){
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Am I at the root of all filesystems?
|
* Am I at the root of all filesystems?
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ( pathloc->node_access == rtems_filesystem_root.node_access ) {
|
if ( pathloc->node_access == rtems_filesystem_root.node_access ) {
|
||||||
break;
|
break;
|
||||||
|
} else {
|
||||||
} else {
|
|
||||||
newloc = pathloc->mt_entry->mt_point_node;
|
newloc = pathloc->mt_entry->mt_point_node;
|
||||||
*pathloc = newloc;
|
*pathloc = newloc;
|
||||||
return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
|
return (*pathloc->ops->evalformake_h)( &path[i], pathloc, name );
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if ( !node->Parent )
|
if ( !node->Parent )
|
||||||
rtems_set_errno_and_return_minus_one( ENOENT );
|
rtems_set_errno_and_return_minus_one( ENOENT );
|
||||||
|
|
||||||
node = node->Parent;
|
node = node->Parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
pathloc->node_access = node;
|
pathloc->node_access = node;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IMFS_NAME:
|
case IMFS_NAME:
|
||||||
|
/*
|
||||||
|
* If we are at a link follow it.
|
||||||
|
*/
|
||||||
|
|
||||||
if ( node->type == IMFS_HARD_LINK ) {
|
if ( node->type == IMFS_HARD_LINK ) {
|
||||||
|
|
||||||
result = IMFS_evaluate_link( pathloc, 0 );
|
result = IMFS_evaluate_link( pathloc, 0 );
|
||||||
if ( result == -1 )
|
if ( result == -1 )
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
} else if ( node->type == IMFS_SYM_LINK ) {
|
} else if ( node->type == IMFS_SYM_LINK ) {
|
||||||
|
|
||||||
result = IMFS_evaluate_link( pathloc, 0 );
|
result = IMFS_evaluate_link( pathloc, 0 );
|
||||||
|
|
||||||
if ( result == -1 )
|
if ( result == -1 )
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
node = pathloc->node_access;
|
node = pathloc->node_access;
|
||||||
if ( !node )
|
if ( !node )
|
||||||
@@ -392,38 +395,38 @@ int IMFS_evaluate_for_make(
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Only a directory can be decended into.
|
* Only a directory can be decended into.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ( node->type != IMFS_DIRECTORY )
|
if ( node->type != IMFS_DIRECTORY )
|
||||||
rtems_set_errno_and_return_minus_one( ENOTDIR );
|
rtems_set_errno_and_return_minus_one( ENOTDIR );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we are at a node that is a mount point. Set loc to the
|
* Otherwise find the token name in the present location.
|
||||||
* new fs root node and let them finish evaluating the path.
|
*/
|
||||||
*/
|
|
||||||
|
|
||||||
if ( node->info.directory.mt_fs != NULL ) {
|
|
||||||
newloc = node->info.directory.mt_fs->mt_fs_root;
|
|
||||||
*pathloc = newloc;
|
|
||||||
return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Otherwise find the token name in the present location.
|
|
||||||
*/
|
|
||||||
|
|
||||||
node = IMFS_find_match_in_dir( node, token );
|
node = IMFS_find_match_in_dir( node, token );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If there is no node we have found the name of the node we
|
* If there is no node we have found the name of the node we
|
||||||
* wish to create.
|
* wish to create.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ( ! node )
|
if ( ! node )
|
||||||
done = true;
|
done = true;
|
||||||
else
|
else {
|
||||||
pathloc->node_access = node;
|
/*
|
||||||
|
* If we are at a node that is a mount point. Set loc to the
|
||||||
|
* new fs root node and let them finish evaluating the path.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ( node->info.directory.mt_fs != NULL ) {
|
||||||
|
newloc = node->info.directory.mt_fs->mt_fs_root;
|
||||||
|
*pathloc = newloc;
|
||||||
|
return (*pathloc->ops->evalformake_h)( &path[i], pathloc, name );
|
||||||
|
}
|
||||||
|
|
||||||
|
pathloc->node_access = node;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IMFS_NO_MORE_PATH:
|
case IMFS_NO_MORE_PATH:
|
||||||
@@ -558,18 +561,15 @@ int IMFS_eval_path(
|
|||||||
} else {
|
} else {
|
||||||
newloc = pathloc->mt_entry->mt_point_node;
|
newloc = pathloc->mt_entry->mt_point_node;
|
||||||
*pathloc = newloc;
|
*pathloc = newloc;
|
||||||
return (*pathloc->ops->evalpath_h)(&(pathname[i-len]),
|
return (*pathloc->ops->evalpath_h)(&(pathname[i]),
|
||||||
pathnamelen+len,
|
pathnamelen,
|
||||||
flags,pathloc);
|
flags,pathloc);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if ( !node->Parent )
|
if ( !node->Parent )
|
||||||
rtems_set_errno_and_return_minus_one( ENOENT );
|
rtems_set_errno_and_return_minus_one( ENOENT );
|
||||||
|
|
||||||
node = node->Parent;
|
node = node->Parent;
|
||||||
pathloc->node_access = node;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pathloc->node_access = node;
|
pathloc->node_access = node;
|
||||||
@@ -604,6 +604,22 @@ int IMFS_eval_path(
|
|||||||
if ( node->type != IMFS_DIRECTORY )
|
if ( node->type != IMFS_DIRECTORY )
|
||||||
rtems_set_errno_and_return_minus_one( ENOTDIR );
|
rtems_set_errno_and_return_minus_one( ENOTDIR );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Otherwise find the token name in the present location.
|
||||||
|
*/
|
||||||
|
|
||||||
|
node = IMFS_find_match_in_dir( node, token );
|
||||||
|
|
||||||
|
if ( !node )
|
||||||
|
rtems_set_errno_and_return_minus_one( ENOENT );
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the node access to the point we have found.
|
||||||
|
*/
|
||||||
|
|
||||||
|
pathloc->node_access = node;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we are at a node that is a mount point. Set loc to the
|
* If we are at a node that is a mount point. Set loc to the
|
||||||
* new fs root node and let them finish evaluating the path.
|
* new fs root node and let them finish evaluating the path.
|
||||||
@@ -612,24 +628,10 @@ int IMFS_eval_path(
|
|||||||
if ( node->info.directory.mt_fs != NULL ) {
|
if ( node->info.directory.mt_fs != NULL ) {
|
||||||
newloc = node->info.directory.mt_fs->mt_fs_root;
|
newloc = node->info.directory.mt_fs->mt_fs_root;
|
||||||
*pathloc = newloc;
|
*pathloc = newloc;
|
||||||
return (*pathloc->ops->evalpath_h)( &pathname[i-len],
|
return (*pathloc->ops->evalpath_h)( &pathname[i],
|
||||||
pathnamelen+len,
|
pathnamelen,
|
||||||
flags, pathloc );
|
flags, pathloc );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Otherwise find the token name in the present location.
|
|
||||||
*/
|
|
||||||
|
|
||||||
node = IMFS_find_match_in_dir( node, token );
|
|
||||||
if ( !node )
|
|
||||||
rtems_set_errno_and_return_minus_one( ENOENT );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the node access to the point we have found.
|
|
||||||
*/
|
|
||||||
|
|
||||||
pathloc->node_access = node;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IMFS_NO_MORE_PATH:
|
case IMFS_NO_MORE_PATH:
|
||||||
|
|||||||
Reference in New Issue
Block a user