this patch is a replacement for the last fdata leak fix

regards
-steve
Index: exec/logsys.c
===================================================================
--- exec/logsys.c       (revision 2962)
+++ exec/logsys.c       (working copy)
@@ -224,23 +224,45 @@
        int fd;
        int res;
        const char *file = "fdata-XXXXXX";
-       char path[128];
+       char path[PATH_MAX];
+       char buffer[PATH_MAX];
+       int i;
+       int written;
 
-       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);
                }
        }
 
-       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) {
+               unlink (path);
                close (fd);
        }
+       memset (buffer, 0, sizeof (buffer));
+       for (i = 0; i < (bytes / 64); i++) {
+retry_write:
+               written = write (fd, buffer, 64);
+               if (written == -1 && errno == EINTR) {
+                       goto retry_write;
+               }
+               if (written != 64) {
+                       unlink (path);
+                       return (-1);
+               }
+       }
+       
+       unlink (path);
 
        addr_orig = mmap (NULL, bytes << 1, PROT_NONE,
                MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
@@ -250,8 +272,8 @@
 
        addr = mmap (addr_orig, bytes, PROT_READ | PROT_WRITE,
                MAP_SHARED | MAP_FIXED, fd, 0);
-
        if (addr != addr_orig) {
+               munmap (addr_orig, bytes << 1);
                return (-1);
        }
        #ifdef COROSYNC_BSD
@@ -262,6 +284,7 @@
                  bytes, PROT_READ | PROT_WRITE,
                  MAP_SHARED | MAP_FIXED, fd, 0);
        if ((char *)addr != (char *)((char *)addr_orig + bytes)) {
+               munmap (addr_orig, bytes << 1);
                return (-1);
        }
 #ifdef COROSYNC_BSD
@@ -269,6 +292,7 @@
 #endif
 
        *buf = addr_orig;
+       close (fd);
        return (0);
 }
 
@@ -1011,6 +1035,7 @@
 int _logsys_rec_init (unsigned int fltsize)
 {
        size_t flt_real_size;
+       int res;
 
        sem_init (&logsys_thread_start, 0, 0);
 
@@ -1034,7 +1059,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