[rtems commit] posix: Only check shm_unlink obj_err if necessary

Joel Sherrill joel at rtems.org
Tue Aug 11 12:48:47 UTC 2020


Module:    rtems
Branch:    5
Commit:    e95c00a79e891674ac4d9a9e43156abf3637463a
Changeset: http://git.rtems.org/rtems/commit/?id=e95c00a79e891674ac4d9a9e43156abf3637463a

Author:    Kinsey Moore <kinsey.moore at oarcorp.com>
Date:      Sat Jun 27 19:21:45 2020 -0500

posix: Only check shm_unlink obj_err if necessary

In the nominal case checked by spsysinit01, obj_err is unmodified if
_POSIX_Shm_Get_by_name returns non-NULL. In the case of shm_unlink, this means
an uninitialized value is passed into the switch and it appears tests using it
were passing by virtue of the stack having the right value on it in most cases.
This now checks obj_err only if _POSIX_Shm_Get_by_name returns NULL.

Close #4016

---

 cpukit/posix/src/shmunlink.c | 45 ++++++++++++++++++++++----------------------
 1 file changed, 23 insertions(+), 22 deletions(-)

diff --git a/cpukit/posix/src/shmunlink.c b/cpukit/posix/src/shmunlink.c
index 053b9c4..a889b40 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();



More information about the vc mailing list