shm: check error value of shm_unlink
[ust.git] / libringbuffer / shm.c
index e1dd56f91d0b06afb293a9d8bd601fc158e72845..563903877f5eb59a62409ce32662a8bd6f7600bd 100644 (file)
@@ -67,8 +67,18 @@ struct shm_object *shm_object_table_append(struct shm_object_table *table,
         * We specifically do _not_ use the / at the beginning of the
         * pathname so that some OS implementations can keep it local to
         * the process (POSIX leaves this implementation-defined).
+        * Ignore the shm_unlink errors, because we handle leaks that
+        * could occur by applications crashing between shm_open and
+        * shm_unlink by unlinking the shm before every open. Therefore,
+        * we can only leak one single shm (and only if the application
+        * crashes between shm_open and the following shm_unlink).
         */
        do {
+               ret = shm_unlink("ust-shm-tmp");
+               if (ret < 0 && errno != ENOENT) {
+                       PERROR("shm_unlink");
+                       goto error_shm_unlink;
+               }
                shmfd = shm_open("ust-shm-tmp",
                                 O_CREAT | O_EXCL | O_RDWR, 0700);
        } while (shmfd < 0 && errno == EEXIST);
@@ -77,9 +87,9 @@ struct shm_object *shm_object_table_append(struct shm_object_table *table,
                goto error_shm_open;
        }
        ret = shm_unlink("ust-shm-tmp");
-       if (ret) {
+       if (ret < 0 && errno != ENOENT) {
                PERROR("shm_unlink");
-               goto error_unlink;
+               goto error_shm_release;
        }
        ret = ftruncate(shmfd, memory_map_size);
        if (ret) {
@@ -104,12 +114,13 @@ struct shm_object *shm_object_table_append(struct shm_object_table *table,
 
 error_mmap:
 error_ftruncate:
-error_unlink:
+error_shm_release:
        ret = close(shmfd);
        if (ret) {
                PERROR("close");
                assert(0);
        }
+error_shm_unlink:
 error_shm_open:
 error_fcntl:
        for (i = 0; i < 2; i++) {
@@ -120,7 +131,6 @@ error_fcntl:
                }
        }
 error_pipe:
-       free(obj);
        return NULL;
        
 }
This page took 0.024362 seconds and 4 git commands to generate.