Changeset e0bc543 in rtems


Ignore:
Timestamp:
Apr 16, 2011, 4:40:11 AM (10 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.11, 5, master
Children:
159f41c
Parents:
a3ca5f36
Message:

2011-04-16 Chris Johns <chrisj@…>

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.
Location:
cpukit
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • cpukit/ChangeLog

    ra3ca5f36 re0bc543  
     12011-04-16      Chris Johns <chrisj@rtems.org>
     2
     3        PR 1774/filesystem
     4        * libfs/src/imfs/imfs_eval.c: Fix the IMFS eval and eval for make
     5        handlers to not inspect a mounted file sytems path.
     6
    172011-04-15      Sebastian Huber <sebastian.huber@embedded-brains.de>
    2 
    38        * libcsupport/src/ioctl.c, libfs/src/pipe/fifo.c: Fixed integer type.
    49
  • cpukit/libfs/src/imfs/imfs_eval.c

    ra3ca5f36 re0bc543  
    293293   */
    294294  pathlen = strlen( path );
     295
    295296  /*
    296297   *  Evaluate all tokens until we are done or an error occurs.
     
    322323       /*
    323324        *  Am I at the root of all filesystems? (chroot'ed?)
    324         */
     325        */
    325326
    326327       if ( pathloc->node_access == rtems_filesystem_root.node_access )
     
    328329
    329330
    330         /*
    331          * Am I at the root of this mounted filesystem?
    332          */
    333 
    334         if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access){
     331       /*
     332        * Am I at the root of this mounted filesystem?
     333        */
     334
     335        if (pathloc->node_access ==
     336            pathloc->mt_entry->mt_fs_root.node_access){
    335337
    336338          /*
    337            *  Am I at the root of all filesystems?
    338            */
     339           *  Am I at the root of all filesystems?
     340           */
    339341
    340342          if ( pathloc->node_access == rtems_filesystem_root.node_access ) {
    341343            break;
    342 
    343           } else {
     344          } else {
    344345            newloc = pathloc->mt_entry->mt_point_node;
    345346            *pathloc = newloc;
    346             return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
    347           }
    348         } else {
    349 
     347            return (*pathloc->ops->evalformake_h)( &path[i], pathloc, name );
     348          }
     349        } else {
    350350          if ( !node->Parent )
    351351            rtems_set_errno_and_return_minus_one( ENOENT );
    352352
    353353          node = node->Parent;
    354         }
     354        }
    355355
    356356        pathloc->node_access = node;
     
    358358
    359359      case IMFS_NAME:
    360 
    361         if ( node->type == IMFS_HARD_LINK ) {
     360        /*
     361         *  If we are at a link follow it.
     362         */
     363
     364        if ( node->type == IMFS_HARD_LINK ) {
    362365
    363366          result = IMFS_evaluate_link( pathloc, 0 );
     
    365368            return -1;
    366369
    367         } else if ( node->type == IMFS_SYM_LINK ) {
     370        } else if ( node->type == IMFS_SYM_LINK ) {
    368371
    369372          result = IMFS_evaluate_link( pathloc, 0 );
     
    371374          if ( result == -1 )
    372375            return -1;
    373         }
     376        }
    374377
    375378        node = pathloc->node_access;
     
    379382        /*
    380383         * Only a directory can be decended into.
    381         */
     384        */
    382385
    383386        if ( node->type != IMFS_DIRECTORY )
    384387          rtems_set_errno_and_return_minus_one( ENOTDIR );
    385388
    386         /*
    387          * If we are at a node that is a mount point. Set loc to the
    388          * new fs root node and let them finish evaluating the path.
    389          */
    390 
    391         if ( node->info.directory.mt_fs != NULL ) {
    392           newloc  = node->info.directory.mt_fs->mt_fs_root;
    393           *pathloc = newloc;
    394           return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
    395         }
    396 
    397         /*
    398          * Otherwise find the token name in the present location.
    399          */
     389        /*
     390         * Otherwise find the token name in the present location.
     391         */
    400392
    401393        node = IMFS_find_match_in_dir( node, token );
    402394
    403         /*
    404         * If there is no node we have found the name of the node we
     395        /*
     396        * If there is no node we have found the name of the node we
    405397         * wish to create.
    406         */
     398        */
    407399
    408400        if ( ! node )
    409401          done = true;
    410         else
     402        else {
     403          /*
     404           * If we are at a node that is a mount point. Set loc to the
     405           * new fs root node and let them finish evaluating the path.
     406           */
     407
     408          if ( node->info.directory.mt_fs != NULL ) {
     409            newloc  = node->info.directory.mt_fs->mt_fs_root;
     410            *pathloc = newloc;
     411            return (*pathloc->ops->evalformake_h)( &path[i], pathloc, name );
     412          }
     413         
    411414          pathloc->node_access = node;
    412 
     415        }
    413416        break;
    414417
     
    544547            newloc = pathloc->mt_entry->mt_point_node;
    545548            *pathloc = newloc;
    546             return (*pathloc->ops->evalpath_h)(&(pathname[i-len]),
    547                                                pathnamelen+len,
     549            return (*pathloc->ops->evalpath_h)(&(pathname[i]),
     550                                               pathnamelen,
    548551                                               flags,pathloc);
    549552          }
    550553        } else {
    551 
    552554          if ( !node->Parent )
    553555            rtems_set_errno_and_return_minus_one( ENOENT );
    554556
    555557          node = node->Parent;
    556           pathloc->node_access = node;
    557 
    558558        }
    559559
     
    565565         *  If we are at a link follow it.
    566566         */
     567
    567568        if ( node->type == IMFS_HARD_LINK ) {
     569
    568570          IMFS_evaluate_hard_link( pathloc, 0 );
     571
    569572          node = pathloc->node_access;
    570        
    571           /*
    572            * It would be a design error if we evaluated the link and
    573            * was broken.
    574            */
    575           IMFS_assert( node );
     573          if ( !node )
     574            rtems_set_errno_and_return_minus_one( ENOTDIR );
    576575
    577576        } else if ( node->type == IMFS_SYM_LINK ) {
     577
    578578          result = IMFS_evaluate_sym_link( pathloc, 0 );
    579579
     
    590590         *  Only a directory can be decended into.
    591591         */
     592
    592593        if ( node->type != IMFS_DIRECTORY )
    593594          rtems_set_errno_and_return_minus_one( ENOTDIR );
    594595
    595596        /*
     597         *  Otherwise find the token name in the present location.
     598         */
     599
     600        node = IMFS_find_match_in_dir( node, token );
     601
     602        if ( !node )
     603          rtems_set_errno_and_return_minus_one( ENOENT );
     604
     605        /*
     606         *  Set the node access to the point we have found.
     607         */
     608
     609        pathloc->node_access = node;
     610       
     611        /*
    596612         *  If we are at a node that is a mount point. Set loc to the
    597613         *  new fs root node and let them finish evaluating the path.
    598614         */
     615
    599616        if ( node->info.directory.mt_fs != NULL ) {
    600617          newloc   = node->info.directory.mt_fs->mt_fs_root;
    601618          *pathloc = newloc;
    602           return (*pathloc->ops->evalpath_h)( &pathname[i-len],
    603                                               pathnamelen+len,
     619          return (*pathloc->ops->evalpath_h)( &pathname[i],
     620                                              pathnamelen,
    604621                                              flags, pathloc );
    605622        }
    606 
    607         /*
    608          *  Otherwise find the token name in the present location.
    609          */
    610         node = IMFS_find_match_in_dir( node, token );
    611         if ( !node )
    612           rtems_set_errno_and_return_minus_one( ENOENT );
    613 
    614         /*
    615          *  Set the node access to the point we have found.
    616          */
    617 
    618         pathloc->node_access = node;
    619623        break;
    620624
Note: See TracChangeset for help on using the changeset viewer.