summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-10-02 15:44:59 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-10-07 17:03:20 +0200
commitc17d0b315baf3f3a3afb862f64d0acf424088442 (patch)
tree4b659a3d629d590525cadec5a32e57fd1ec8ad78
parentscore: Critical fix for thread dispatching (diff)
downloadrtems-c17d0b315baf3f3a3afb862f64d0acf424088442.tar.bz2
Filesystem: Reject removal of root nodes
Reject the removal of file system instance root nodes in rmdir() and unlink() and return the EBUSY error status. File system instances can be removed with unmount(). Remove root node special cases in IMFS, DOSFS, and RFS.
-rw-r--r--cpukit/libcsupport/src/rmdir.c7
-rw-r--r--cpukit/libcsupport/src/unlink.c10
-rw-r--r--cpukit/libfs/src/dosfs/msdos_rmnod.c8
-rw-r--r--cpukit/libfs/src/imfs/imfs.h6
-rw-r--r--cpukit/libfs/src/imfs/imfs_handlers_directory.c5
-rw-r--r--cpukit/libfs/src/imfs/imfs_handlers_link.c5
-rw-r--r--cpukit/libfs/src/imfs/imfs_initsupp.c3
-rw-r--r--cpukit/libfs/src/imfs/imfs_rmnod.c5
-rw-r--r--cpukit/libfs/src/rfs/rtems-rfs-rtems.c3
-rw-r--r--testsuites/fstests/fsimfsgeneric01/init.c5
10 files changed, 23 insertions, 34 deletions
diff --git a/cpukit/libcsupport/src/rmdir.c b/cpukit/libcsupport/src/rmdir.c
index 4e7baf5e39..f2bc16e516 100644
--- a/cpukit/libcsupport/src/rmdir.c
+++ b/cpukit/libcsupport/src/rmdir.c
@@ -38,7 +38,12 @@ int rmdir( const char *path )
rtems_filesystem_node_types_t type = (*ops->node_type_h)( currentloc );
if ( type == RTEMS_FILESYSTEM_DIRECTORY ) {
- rv = (*ops->rmnod_h)( &parentloc, currentloc );
+ if ( !rtems_filesystem_location_is_root( currentloc ) ) {
+ rv = (*ops->rmnod_h)( &parentloc, currentloc );
+ } else {
+ rtems_filesystem_eval_path_error( &ctx, EBUSY );
+ rv = -1;
+ }
} else {
rtems_filesystem_eval_path_error( &ctx, ENOTDIR );
rv = -1;
diff --git a/cpukit/libcsupport/src/unlink.c b/cpukit/libcsupport/src/unlink.c
index 9817ad9611..2a3b1c75a8 100644
--- a/cpukit/libcsupport/src/unlink.c
+++ b/cpukit/libcsupport/src/unlink.c
@@ -34,9 +34,15 @@ int unlink( const char *path )
&parentloc,
parent_eval_flags
);
- const rtems_filesystem_operations_table *ops = currentloc->mt_entry->ops;
- rv = (*ops->rmnod_h)( &parentloc, currentloc );
+ if ( !rtems_filesystem_location_is_root( currentloc ) ) {
+ const rtems_filesystem_operations_table *ops = currentloc->mt_entry->ops;
+
+ rv = (*ops->rmnod_h)( &parentloc, currentloc );
+ } else {
+ rtems_filesystem_eval_path_error( &ctx, EBUSY );
+ rv = -1;
+ }
rtems_filesystem_eval_path_cleanup_with_parent( &ctx, &parentloc );
diff --git a/cpukit/libfs/src/dosfs/msdos_rmnod.c b/cpukit/libfs/src/dosfs/msdos_rmnod.c
index db08352600..099b9287e5 100644
--- a/cpukit/libfs/src/dosfs/msdos_rmnod.c
+++ b/cpukit/libfs/src/dosfs/msdos_rmnod.c
@@ -51,14 +51,6 @@ msdos_rmnod(const rtems_filesystem_location_info_t *parent_pathloc,
}
/*
- * You cannot remove the file system root node.
- */
- if (rtems_filesystem_location_is_root(pathloc))
- {
- rtems_set_errno_and_return_minus_one(EBUSY);
- }
-
- /*
* You cannot remove a mountpoint.
* not used - mount() not implemenetd yet.
*/
diff --git a/cpukit/libfs/src/imfs/imfs.h b/cpukit/libfs/src/imfs/imfs.h
index 7c0cbe5931..aed00778e7 100644
--- a/cpukit/libfs/src/imfs/imfs.h
+++ b/cpukit/libfs/src/imfs/imfs.h
@@ -169,13 +169,11 @@ IMFS_jnode_t *IMFS_node_initialize_generic(
);
typedef IMFS_jnode_t *(*IMFS_node_control_remove)(
- IMFS_jnode_t *node,
- const IMFS_jnode_t *root_node
+ IMFS_jnode_t *node
);
IMFS_jnode_t *IMFS_node_remove_default(
- IMFS_jnode_t *node,
- const IMFS_jnode_t *root_node
+ IMFS_jnode_t *node
);
typedef IMFS_jnode_t *(*IMFS_node_control_destroy)( IMFS_jnode_t *node );
diff --git a/cpukit/libfs/src/imfs/imfs_handlers_directory.c b/cpukit/libfs/src/imfs/imfs_handlers_directory.c
index 0663e7a206..9dcdcf2a90 100644
--- a/cpukit/libfs/src/imfs/imfs_handlers_directory.c
+++ b/cpukit/libfs/src/imfs/imfs_handlers_directory.c
@@ -74,14 +74,13 @@ static bool IMFS_is_mount_point( const IMFS_jnode_t *node )
}
static IMFS_jnode_t *IMFS_node_remove_directory(
- IMFS_jnode_t *node,
- const IMFS_jnode_t *root_node
+ IMFS_jnode_t *node
)
{
if ( !rtems_chain_is_empty( &node->info.directory.Entries ) ) {
errno = ENOTEMPTY;
node = NULL;
- } else if ( node == root_node || IMFS_is_mount_point( node ) ) {
+ } else if ( IMFS_is_mount_point( node ) ) {
errno = EBUSY;
node = NULL;
}
diff --git a/cpukit/libfs/src/imfs/imfs_handlers_link.c b/cpukit/libfs/src/imfs/imfs_handlers_link.c
index baf58313c8..2c4ad3f66f 100644
--- a/cpukit/libfs/src/imfs/imfs_handlers_link.c
+++ b/cpukit/libfs/src/imfs/imfs_handlers_link.c
@@ -64,14 +64,13 @@ static IMFS_jnode_t *IMFS_node_initialize_hard_link(
}
static IMFS_jnode_t *IMFS_node_remove_hard_link(
- IMFS_jnode_t *node,
- const IMFS_jnode_t *root_node
+ IMFS_jnode_t *node
)
{
IMFS_jnode_t *target = node->info.hard_link.link_node;
if ( target->st_nlink == 1) {
- target = (*target->control->node_remove)( target, root_node );
+ target = (*target->control->node_remove)( target );
if ( target == NULL ) {
node = NULL;
}
diff --git a/cpukit/libfs/src/imfs/imfs_initsupp.c b/cpukit/libfs/src/imfs/imfs_initsupp.c
index 26152d8d3d..3bb8a979fc 100644
--- a/cpukit/libfs/src/imfs/imfs_initsupp.c
+++ b/cpukit/libfs/src/imfs/imfs_initsupp.c
@@ -141,8 +141,7 @@ IMFS_jnode_t *IMFS_node_initialize_default(
}
IMFS_jnode_t *IMFS_node_remove_default(
- IMFS_jnode_t *node,
- const IMFS_jnode_t *root_node
+ IMFS_jnode_t *node
)
{
return node;
diff --git a/cpukit/libfs/src/imfs/imfs_rmnod.c b/cpukit/libfs/src/imfs/imfs_rmnod.c
index a0fa1d654c..90e61d9ee9 100644
--- a/cpukit/libfs/src/imfs/imfs_rmnod.c
+++ b/cpukit/libfs/src/imfs/imfs_rmnod.c
@@ -29,10 +29,7 @@ int IMFS_rmnod(
int rv = 0;
IMFS_jnode_t *node = loc->node_access;
- node = (*node->control->node_remove)(
- node,
- loc->mt_entry->mt_fs_root->location.node_access
- );
+ node = (*node->control->node_remove)( node );
if ( node != NULL ) {
--node->reference_count;
--node->st_nlink;
diff --git a/cpukit/libfs/src/rfs/rtems-rfs-rtems.c b/cpukit/libfs/src/rfs/rtems-rfs-rtems.c
index ba6c9056e6..6ff9793911 100644
--- a/cpukit/libfs/src/rfs/rtems-rfs-rtems.c
+++ b/cpukit/libfs/src/rfs/rtems-rfs-rtems.c
@@ -678,9 +678,6 @@ rtems_rfs_rtems_rmnod (const rtems_filesystem_location_info_t* parent_pathloc,
printf ("rtems-rfs: rmnod: parent:%" PRId32 " doff:%" PRIu32 ", ino:%" PRId32 "\n",
parent, doff, ino);
- if (ino == RTEMS_RFS_ROOT_INO)
- return rtems_rfs_rtems_error ("rmnod: root inode", EBUSY);
-
rc = rtems_rfs_unlink (fs, parent, ino, doff, rtems_rfs_unlink_dir_if_empty);
if (rc)
{
diff --git a/testsuites/fstests/fsimfsgeneric01/init.c b/testsuites/fstests/fsimfsgeneric01/init.c
index 9fd4bad43a..1a25dec661 100644
--- a/testsuites/fstests/fsimfsgeneric01/init.c
+++ b/testsuites/fstests/fsimfsgeneric01/init.c
@@ -233,10 +233,7 @@ static IMFS_jnode_t *node_initialize(
return node;
}
-static IMFS_jnode_t *node_remove(
- IMFS_jnode_t *node,
- const IMFS_jnode_t *root_node
-)
+static IMFS_jnode_t *node_remove(IMFS_jnode_t *node)
{
test_state *state = IMFS_generic_get_context_by_node(node);