From efb5450a87d50c53584d361c92d5928098233f58 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Wed, 17 Oct 2001 17:57:42 +0000 Subject: 2001-10-17 Till Straumann * These changes were discussed and reviewed by many people but the primary people were Jennifer Averett and Eugeny Mints . * 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. --- cpukit/libcsupport/src/link.c | 2 -- cpukit/libcsupport/src/open.c | 6 ++++++ cpukit/libcsupport/src/unmount.c | 7 +++++-- cpukit/libcsupport/src/utime.c | 4 +++- 4 files changed, 14 insertions(+), 5 deletions(-) (limited to 'cpukit') 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 ); -- cgit v1.2.3