here is take 3 of the patch

should have all error conditions handled in the exit phase.

Regards
-steve
Index: exec/logsys.c
===================================================================
--- exec/logsys.c       (revision 2962)
+++ exec/logsys.c       (working copy)
@@ -214,6 +214,8 @@
 
 #define FDMAX_ARGS     64
 
+#define CIRCULAR_BUFFER_WRITE_SIZE     64
+
 /* forward declarations */
 static void logsys_close_logfile(int subsysid);
 
@@ -224,35 +226,58 @@
        int fd;
        int res;
        const char *file = "fdata-XXXXXX";
-       char path[128];
+       char path[PATH_MAX];
+       char buffer[CIRCULAR_BUFFER_WRITE_SIZE];
+       int i;
+       int written;
+       int error_return = 0;
 
-       sprintf (path, "/dev/shm/%s", file);
+       snprintf (path, PATH_MAX, "/dev/shm/%s", file);
 
        fd = mkstemp (path);
        if (fd == -1) {
-               sprintf (path, LOCALSTATEDIR "/run/%s", file);
+               snprintf (path, PATH_MAX, LOCALSTATEDIR "/run/%s", file);
                fd = mkstemp (path);
                if (fd == -1) {
-                       return (-1);
+                       error_return = -1;
+                       goto error_exit;
                }
        }
 
-       res = ftruncate (fd, bytes);
+       /*
+        * ftruncate doesn't return ENOSPC
+        * have to use write to determine if shared memory is actually available
+        */
+       res = ftruncate (fd, 0);
        if (res == -1) {
-               close (fd);
+               error_return = -1;
+               goto unlink_exit;
        }
-
+       memset (buffer, 0, sizeof (buffer));
+       for (i = 0; i < (bytes / CIRCULAR_BUFFER_WRITE_SIZE); i++) {
+retry_write:
+               written = write (fd, buffer, CIRCULAR_BUFFER_WRITE_SIZE);
+               if (written == -1 && errno == EINTR) {
+                       goto retry_write;
+               }
+               if (written != 64) {
+                       error_return = -1;
+                       goto unlink_exit;
+               }
+       }
+       
        addr_orig = mmap (NULL, bytes << 1, PROT_NONE,
                MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
        if (addr_orig == MAP_FAILED) {
-               return (-1);
+               error_return = -1;
+               goto unlink_exit;
        }
 
        addr = mmap (addr_orig, bytes, PROT_READ | PROT_WRITE,
                MAP_SHARED | MAP_FIXED, fd, 0);
-
        if (addr != addr_orig) {
-               return (-1);
+               error_return = -1;
+               goto mmap_exit;
        }
        #ifdef COROSYNC_BSD
                madvise(addr_orig, bytes, MADV_NOSYNC);
@@ -262,14 +287,24 @@
                  bytes, PROT_READ | PROT_WRITE,
                  MAP_SHARED | MAP_FIXED, fd, 0);
        if ((char *)addr != (char *)((char *)addr_orig + bytes)) {
-               return (-1);
+               error_return = -1;
+               goto mmap_exit;
        }
 #ifdef COROSYNC_BSD
        madvise(((char *)addr_orig) + bytes, bytes, MADV_NOSYNC);
 #endif
 
        *buf = addr_orig;
-       return (0);
+       error_return = 0;
+       goto unlink_exit;
+
+mmap_exit:
+       munmap (addr_orig, bytes << 1);
+unlink_exit:
+       unlink (path);
+       close (fd);
+error_exit:
+       return (error_return);
 }
 
 #if defined(HAVE_PTHREAD_SPIN_LOCK)
@@ -1011,6 +1046,7 @@
 int _logsys_rec_init (unsigned int fltsize)
 {
        size_t flt_real_size;
+       int res;
 
        sem_init (&logsys_thread_start, 0, 0);
 
@@ -1034,7 +1070,16 @@
 
        flt_real_size = ROUNDUP(fltsize, sysconf(_SC_PAGESIZE)) * 4;
 
-       circular_memory_map ((void **)&flt_data, flt_real_size);
+       res = circular_memory_map ((void **)&flt_data, flt_real_size);
+       if (res == -1) {
+               sem_destroy (&logsys_thread_start);
+               sem_destroy (&logsys_print_finished);
+#if defined(HAVE_PTHREAD_SPIN_LOCK)
+               pthread_spin_destroy (&logsys_flt_spinlock);
+               pthread_spin_destroy (&logsys_wthread_spinlock);
+#endif
+               return (-1);
+       }
 
        memset (flt_data, 0, flt_real_size * 2);
        /*
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to