diff options
-rw-r--r-- | cpukit/posix/src/shmunlink.c | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/cpukit/posix/src/shmunlink.c b/cpukit/posix/src/shmunlink.c index 053b9c4946..a889b4029c 100644 --- a/cpukit/posix/src/shmunlink.c +++ b/cpukit/posix/src/shmunlink.c @@ -29,28 +29,29 @@ int shm_unlink( const char *name ) _Objects_Allocator_lock(); shm = _POSIX_Shm_Get_by_name( name, 0, &obj_err ); - switch ( obj_err ) { - case OBJECTS_GET_BY_NAME_INVALID_NAME: - err = ENOENT; - break; - - case OBJECTS_GET_BY_NAME_NAME_TOO_LONG: - err = ENAMETOOLONG; - break; - - case OBJECTS_GET_BY_NAME_NO_OBJECT: - default: - _Objects_Namespace_remove_string( - &_POSIX_Shm_Information, - &shm->Object - ); - - if ( shm->reference_count == 0 ) { - /* Only remove the shm object if no references exist to it. Otherwise, - * the shm object will be freed later in _POSIX_Shm_Attempt_delete */ - _POSIX_Shm_Free( shm ); - } - break; + if ( shm ) { + _Objects_Namespace_remove_string( + &_POSIX_Shm_Information, + &shm->Object + ); + + if ( shm->reference_count == 0 ) { + /* Only remove the shm object if no references exist to it. Otherwise, + * the shm object will be freed later in _POSIX_Shm_Attempt_delete */ + _POSIX_Shm_Free( shm ); + } + } else { + switch ( obj_err ) { + case OBJECTS_GET_BY_NAME_NAME_TOO_LONG: + err = ENAMETOOLONG; + break; + + case OBJECTS_GET_BY_NAME_INVALID_NAME: + case OBJECTS_GET_BY_NAME_NO_OBJECT: + default: + err = ENOENT; + break; + } } _Objects_Allocator_unlock(); |