Просмотр исходного кода

cov (10387, 10397): cleanup memory mapping functions

git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2840 fd59a12c-fef9-0310-b244-a6a79926bd2f
Angus Salkeld 15 лет назад
Родитель
Сommit
b2a304d8f8
2 измененных файлов с 41 добавлено и 4 удалено
  1. 25 4
      exec/coroipcs.c
  2. 16 0
      lib/coroipcc.c

+ 25 - 4
exec/coroipcs.c

@@ -263,13 +263,21 @@ memory_map (
 
 	unlink (path);
 
-	if (fd >= 0) {
-		res = ftruncate (fd, bytes);
+	if (fd == -1) {
+		return (-1);
 	}
+
+	res = ftruncate (fd, bytes);
+	if (res == -1) {
+		close (fd);
+		return (-1);
+	}
+
 	addr_orig = mmap (NULL, bytes, PROT_NONE,
 		MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
 
 	if (addr_orig == MAP_FAILED) {
+		close (fd);
 		return (-1);
 	}
 
@@ -277,6 +285,7 @@ memory_map (
 		MAP_FIXED | MAP_SHARED, fd, 0);
 
 	if (addr != addr_orig) {
+		close (fd);
 		return (-1);
 	}
 #ifdef COROSYNC_BSD
@@ -306,13 +315,20 @@ circular_memory_map (
 
 	unlink (path);
 
-	if (fd >= 0) {
-		res = ftruncate (fd, bytes);
+	if (fd == -1) {
+		return (-1);
 	}
+	res = ftruncate (fd, bytes);
+	if (res == -1) {
+		close (fd);
+		return (-1);
+	}
+
 	addr_orig = mmap (NULL, bytes << 1, PROT_NONE,
 		MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
 
 	if (addr_orig == MAP_FAILED) {
+		close (fd);
 		return (-1);
 	}
 
@@ -320,6 +336,7 @@ circular_memory_map (
 		MAP_FIXED | MAP_SHARED, fd, 0);
 
 	if (addr != addr_orig) {
+		close (fd);
 		return (-1);
 	}
 #ifdef COROSYNC_BSD
@@ -329,6 +346,10 @@ circular_memory_map (
 	addr = mmap (((char *)addr_orig) + bytes,
                   bytes, PROT_READ | PROT_WRITE,
                   MAP_FIXED | MAP_SHARED, fd, 0);
+	if (addr == MAP_FAILED) {
+		close (fd);
+		return (-1);
+	}
 #ifdef COROSYNC_BSD
 	madvise(((char *)addr_orig) + bytes, bytes, MADV_NOSYNC);
 #endif

+ 16 - 0
lib/coroipcc.c

@@ -300,11 +300,16 @@ circular_memory_map (char *path, const char *file, void **buf, size_t bytes)
 	}
 
 	res = ftruncate (fd, bytes);
+	if (res == -1) {
+		close (fd);
+		return (-1);
+	}
 
 	addr_orig = mmap (NULL, bytes << 1, PROT_NONE,
 		MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
 
 	if (addr_orig == MAP_FAILED) {
+		close (fd);
 		return (-1);
 	}
 
@@ -312,6 +317,7 @@ circular_memory_map (char *path, const char *file, void **buf, size_t bytes)
 		MAP_FIXED | MAP_SHARED, fd, 0);
 
 	if (addr != addr_orig) {
+		close (fd);
 		return (-1);
 	}
 #ifdef COROSYNC_BSD
@@ -321,6 +327,10 @@ circular_memory_map (char *path, const char *file, void **buf, size_t bytes)
 	addr = mmap (((char *)addr_orig) + bytes,
                   bytes, PROT_READ | PROT_WRITE,
                   MAP_FIXED | MAP_SHARED, fd, 0);
+	if (addr == MAP_FAILED) {
+		close (fd);
+		return (-1);
+	}
 #ifdef COROSYNC_BSD
 	madvise(((char *)addr_orig) + bytes, bytes, MADV_NOSYNC);
 #endif
@@ -372,11 +382,16 @@ memory_map (char *path, const char *file, void **buf, size_t bytes)
 	}
 
 	res = ftruncate (fd, bytes);
+	if (res == -1) {
+		close (fd);
+		return (-1);
+	}
 
 	addr_orig = mmap (NULL, bytes, PROT_NONE,
 		MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
 
 	if (addr_orig == MAP_FAILED) {
+		close (fd);
 		return (-1);
 	}
 
@@ -384,6 +399,7 @@ memory_map (char *path, const char *file, void **buf, size_t bytes)
 		MAP_FIXED | MAP_SHARED, fd, 0);
 
 	if (addr != addr_orig) {
+		close (fd);
 		return (-1);
 	}
 #ifdef COROSYNC_BSD