summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2001-10-17 17:57:42 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2001-10-17 17:57:42 +0000
commitefb5450a87d50c53584d361c92d5928098233f58 (patch)
tree8068a8a16853a494ec4b565475d4d0f015872b2b /cpukit
parent080afecb64218725773fe76353cab709412c9ce0 (diff)
downloadrtems-efb5450a87d50c53584d361c92d5928098233f58.tar.bz2
2001-10-17 Till Straumann <strauman@SLAC.Stanford.EDU>
* These changes were discussed and reviewed by many people but the primary people were Jennifer Averett <jennifer@OARcorp.com> and Eugeny Mints <jack@oktet.ru>. * libc/utime.c: Add missing call to rtems_filesystem_freenode() at verification that utime is supported by the filesystem. * libc/link.c: Remove calls to freenode when the node was not successfully allocated. * libc/unmount.c: In the method file_systems_below_this_mountpoint() added calls to correctly free fs_root_loc when a failure occurs. * libc/open.c: Add freenode calls upon failure. * libc/open.c, lib/libc/close.c: (PENDING -- NOT INCLUDED THIS TIMER) Modifications the move the freenode from open() to close() (also part of this patch) are pending further discussion.
Diffstat (limited to 'cpukit')
-rw-r--r--cpukit/libcsupport/src/link.c2
-rw-r--r--cpukit/libcsupport/src/open.c6
-rw-r--r--cpukit/libcsupport/src/unmount.c7
-rw-r--r--cpukit/libcsupport/src/utime.c4
4 files changed, 14 insertions, 5 deletions
diff --git a/cpukit/libcsupport/src/link.c b/cpukit/libcsupport/src/link.c
index 2dd4c5a55e..0797600849 100644
--- a/cpukit/libcsupport/src/link.c
+++ b/cpukit/libcsupport/src/link.c
@@ -48,14 +48,12 @@ int link(
if ( !parent_loc.ops->evalformake_h ) {
rtems_filesystem_freenode( &existing_loc );
- rtems_filesystem_freenode( &parent_loc );
set_errno_and_return_minus_one( ENOTSUP );
}
result = (*parent_loc.ops->evalformake_h)( &new[i], &parent_loc, &name_start );
if ( result != 0 ) {
rtems_filesystem_freenode( &existing_loc );
- rtems_filesystem_freenode( &parent_loc );
set_errno_and_return_minus_one( result );
}
diff --git a/cpukit/libcsupport/src/open.c b/cpukit/libcsupport/src/open.c
index d1dbcb77c4..bfb4117e73 100644
--- a/cpukit/libcsupport/src/open.c
+++ b/cpukit/libcsupport/src/open.c
@@ -66,6 +66,7 @@ int open(
rtems_libio_t *iop = 0;
int status;
rtems_filesystem_location_info_t loc;
+ rtems_filesystem_location_info_t *loc_to_free = NULL;
int eval_flags;
@@ -138,9 +139,12 @@ int open(
} else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) {
/* We were trying to create a file that already exists */
rc = EEXIST;
+ loc_to_free = &loc;
goto done;
}
+ loc_to_free = &loc;
+
/*
* Fill in the file control block based on the loc structure
* returned by successful path evaluation.
@@ -178,6 +182,8 @@ done:
if ( rc ) {
if ( iop )
rtems_libio_free( iop );
+ if ( loc_to_free )
+ rtems_filesystem_freenode( loc_to_free );
set_errno_and_return_minus_one( rc );
}
diff --git a/cpukit/libcsupport/src/unmount.c b/cpukit/libcsupport/src/unmount.c
index dfd1797112..81e097c818 100644
--- a/cpukit/libcsupport/src/unmount.c
+++ b/cpukit/libcsupport/src/unmount.c
@@ -168,8 +168,10 @@ int file_systems_below_this_mountpoint(
*/
*fs_to_unmount = *fs_root_loc->mt_entry;
- if ( fs_to_unmount->mt_fs_root.node_access != fs_root_loc->node_access )
+ if ( fs_to_unmount->mt_fs_root.node_access != fs_root_loc->node_access ){
+ rtems_filesystem_freenode(fs_root_loc);
set_errno_and_return_minus_one( EACCES );
+ }
/*
* Search the mount table for any mount entries referencing this
@@ -181,7 +183,8 @@ int file_systems_below_this_mountpoint(
the_node = the_node->next ) {
the_mount_entry = ( rtems_filesystem_mount_table_entry_t * )the_node;
if (the_mount_entry->mt_point_node.mt_entry == fs_root_loc->mt_entry ) {
- set_errno_and_return_minus_one( EBUSY );
+ rtems_filesystem_freenode(fs_root_loc);
+ set_errno_and_return_minus_one( EBUSY );
}
}
diff --git a/cpukit/libcsupport/src/utime.c b/cpukit/libcsupport/src/utime.c
index dcfad893cd..ba9a50a63d 100644
--- a/cpukit/libcsupport/src/utime.c
+++ b/cpukit/libcsupport/src/utime.c
@@ -32,8 +32,10 @@ int utime(
if ( rtems_filesystem_evaluate_path( path, 0x00, &temp_loc, TRUE ) )
return -1;
- if ( !temp_loc.ops->utime_h )
+ if ( !temp_loc.ops->utime_h ){
+ rtems_filesystem_freenode( &temp_loc );
set_errno_and_return_minus_one( ENOTSUP );
+ }
result = (*temp_loc.ops->utime_h)( &temp_loc, times->actime, times->modtime );