Browse Source

Fix problem where flight data leaks files in /dev/shm when corosync is
restarted continuously via init scripts.


git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2964 fd59a12c-fef9-0310-b244-a6a79926bd2f

Steven Dake 15 years ago
parent
commit
7b832592b0
1 changed files with 58 additions and 13 deletions
  1. 58 13
      exec/logsys.c

+ 58 - 13
exec/logsys.c

@@ -214,6 +214,8 @@ static DECLARE_LIST_INIT(logsys_print_finished_records);
 
 
 #define FDMAX_ARGS	64
 #define FDMAX_ARGS	64
 
 
+#define CIRCULAR_BUFFER_WRITE_SIZE	64
+
 /* forward declarations */
 /* forward declarations */
 static void logsys_close_logfile(int subsysid);
 static void logsys_close_logfile(int subsysid);
 
 
@@ -224,35 +226,58 @@ static uint32_t circular_memory_map (void **buf, size_t bytes)
 	int fd;
 	int fd;
 	int res;
 	int res;
 	const char *file = "fdata-XXXXXX";
 	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);
 	fd = mkstemp (path);
 	if (fd == -1) {
 	if (fd == -1) {
-		sprintf (path, LOCALSTATEDIR "/run/%s", file);
+		snprintf (path, PATH_MAX, LOCALSTATEDIR "/run/%s", file);
 		fd = mkstemp (path);
 		fd = mkstemp (path);
 		if (fd == -1) {
 		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) {
 	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,
 	addr_orig = mmap (NULL, bytes << 1, PROT_NONE,
 		MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
 		MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
 	if (addr_orig == MAP_FAILED) {
 	if (addr_orig == MAP_FAILED) {
-		return (-1);
+		error_return = -1;
+		goto unlink_exit;
 	}
 	}
 
 
 	addr = mmap (addr_orig, bytes, PROT_READ | PROT_WRITE,
 	addr = mmap (addr_orig, bytes, PROT_READ | PROT_WRITE,
 		MAP_SHARED | MAP_FIXED, fd, 0);
 		MAP_SHARED | MAP_FIXED, fd, 0);
-
 	if (addr != addr_orig) {
 	if (addr != addr_orig) {
-		return (-1);
+		error_return = -1;
+		goto mmap_exit;
 	}
 	}
 	#ifdef COROSYNC_BSD
 	#ifdef COROSYNC_BSD
 		madvise(addr_orig, bytes, MADV_NOSYNC);
 		madvise(addr_orig, bytes, MADV_NOSYNC);
@@ -262,14 +287,24 @@ static uint32_t circular_memory_map (void **buf, size_t bytes)
 		  bytes, PROT_READ | PROT_WRITE,
 		  bytes, PROT_READ | PROT_WRITE,
 		  MAP_SHARED | MAP_FIXED, fd, 0);
 		  MAP_SHARED | MAP_FIXED, fd, 0);
 	if ((char *)addr != (char *)((char *)addr_orig + bytes)) {
 	if ((char *)addr != (char *)((char *)addr_orig + bytes)) {
-		return (-1);
+		error_return = -1;
+		goto mmap_exit;
 	}
 	}
 #ifdef COROSYNC_BSD
 #ifdef COROSYNC_BSD
 	madvise(((char *)addr_orig) + bytes, bytes, MADV_NOSYNC);
 	madvise(((char *)addr_orig) + bytes, bytes, MADV_NOSYNC);
 #endif
 #endif
 
 
 	*buf = addr_orig;
 	*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)
 #if defined(HAVE_PTHREAD_SPIN_LOCK)
@@ -1011,6 +1046,7 @@ int _logsys_wthread_create (void)
 int _logsys_rec_init (unsigned int fltsize)
 int _logsys_rec_init (unsigned int fltsize)
 {
 {
 	size_t flt_real_size;
 	size_t flt_real_size;
+	int res;
 
 
 	sem_init (&logsys_thread_start, 0, 0);
 	sem_init (&logsys_thread_start, 0, 0);
 
 
@@ -1034,7 +1070,16 @@ int _logsys_rec_init (unsigned int fltsize)
 
 
 	flt_real_size = ROUNDUP(fltsize, sysconf(_SC_PAGESIZE)) * 4;
 	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);
 	memset (flt_data, 0, flt_real_size * 2);
 	/*
 	/*