Example #1
0
static void set_startloc(
  rtems_filesystem_eval_path_context_t *ctx,
  rtems_filesystem_global_location_t *const *global_root_ptr,
  rtems_filesystem_global_location_t *const *global_current_ptr
)
{
  if (ctx->pathlen > 0) {
    char c = ctx->path [0];

    ctx->rootloc = rtems_filesystem_global_location_obtain(global_root_ptr);

    if (rtems_filesystem_is_delimiter(c)) {
      ++ctx->path;
      --ctx->pathlen;
      ctx->startloc = rtems_filesystem_global_location_obtain(
        &ctx->rootloc
      );
    } else {
      ctx->startloc = rtems_filesystem_global_location_obtain(
        global_current_ptr
      );
    }
  } else {
    ctx->rootloc = rtems_filesystem_global_location_obtain_null();
    ctx->startloc = rtems_filesystem_global_location_obtain_null();
    errno = ENOENT;
  }
}
Example #2
0
void rtems_filesystem_eval_path_restart(
  rtems_filesystem_eval_path_context_t *ctx,
  rtems_filesystem_global_location_t **newstartloc_ptr
)
{
  free_location(&ctx->currentloc);
  rtems_filesystem_instance_unlock(&ctx->startloc->location);
  rtems_filesystem_global_location_assign(
    &ctx->startloc,
    rtems_filesystem_global_location_obtain(newstartloc_ptr)
  );
  rtems_filesystem_instance_lock(&ctx->startloc->location);
  rtems_filesystem_location_clone(&ctx->currentloc, &ctx->startloc->location);
}
Example #3
0
static int register_root_file_system(
  rtems_filesystem_mount_table_entry_t *mt_entry
)
{
  int rv = 0;

  rtems_filesystem_mt_lock();
  if ( rtems_chain_is_empty( &rtems_filesystem_mount_table ) ) {
    rtems_chain_append_unprotected(
      &rtems_filesystem_mount_table,
      &mt_entry->mt_node
    );
  } else {
    errno = EINVAL;
    rv = -1;
  }
  rtems_filesystem_mt_unlock();

  if ( rv == 0 ) {
    rtems_filesystem_global_location_t *new_fs_root =
      rtems_filesystem_global_location_obtain( &mt_entry->mt_fs_root );
    rtems_filesystem_global_location_t *new_fs_current =
      rtems_filesystem_global_location_obtain( &mt_entry->mt_fs_root );

    rtems_filesystem_global_location_assign(
      &rtems_filesystem_root,
      new_fs_root
    );
    rtems_filesystem_global_location_assign(
      &rtems_filesystem_current,
      new_fs_current
    );
  }

  return rv;
}
Example #4
0
int chroot( const char *path )
{
  int rv = 0;
  rtems_status_code sc = RTEMS_SUCCESSFUL;
  rtems_filesystem_eval_path_context_t ctx;
  int eval_flags = RTEMS_FS_PERMS_EXEC
    | RTEMS_FS_FOLLOW_LINK;
  rtems_filesystem_location_info_t loc;
  rtems_filesystem_global_location_t *new_current_loc;

  /*
   * We use the global environment for path evaluation.  This makes it possible
   * to escape from a chroot environment referencing an unmounted file system.
   */
  rtems_filesystem_eval_path_start_with_root_and_current(
    &ctx,
    path,
    eval_flags,
    &rtems_global_user_env.root_directory,
    &rtems_global_user_env.current_directory
  );

  rtems_filesystem_eval_path_extract_currentloc( &ctx, &loc );
  new_current_loc = rtems_filesystem_location_transform_to_global( &loc );
  if ( !rtems_filesystem_global_location_is_null( new_current_loc ) ) {
    rtems_filesystem_global_location_t *new_root_loc =
      rtems_filesystem_global_location_obtain( &new_current_loc );
    rtems_filesystem_node_types_t type =
      (*new_root_loc->location.mt_entry->ops->node_type_h)(
        &new_root_loc->location
      );

    if ( type == RTEMS_FILESYSTEM_DIRECTORY ) {
      sc = rtems_libio_set_private_env();
      if (sc == RTEMS_SUCCESSFUL) {
        rtems_filesystem_global_location_assign(
          &rtems_filesystem_root,
          new_root_loc
        );
        rtems_filesystem_global_location_assign(
          &rtems_filesystem_current,
          new_current_loc
        );
      } else {
        if (sc != RTEMS_UNSATISFIED) {
          errno = ENOMEM;
        }
        rv = -1;
      }
    } else {
      rtems_filesystem_location_error( &new_root_loc->location, ENOTDIR );
      rv = -1;
    }

    if ( rv != 0 ) {
      rtems_filesystem_global_location_release( new_root_loc );
    }
  } else {
    rv = -1;
  }

  rtems_filesystem_eval_path_cleanup( &ctx );

  if ( rv != 0 ) {
    rtems_filesystem_global_location_release( new_current_loc );
  }

  return rv;
}