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