[lvm-devel] LVM2/daemons/clvmd clvmd.c

mornfall at sourceware.org mornfall at sourceware.org
Wed Oct 27 11:40:15 UTC 2010


CVSROOT:	/cvs/lvm2
Module name:	LVM2
Changes by:	mornfall at sourceware.org	2010-10-27 11:40:15

Modified files:
	daemons/clvmd  : clvmd.c 

Log message:
	Alasdair correctly pointed out that if the two closes are concurrent (I haven't
	checked, so they *might*), there is still a race possibility with the last
	fix. This patch fixes that.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/clvmd/clvmd.c.diff?cvsroot=lvm2&r1=1.81&r2=1.82

--- LVM2/daemons/clvmd/clvmd.c	2010/10/27 09:13:37	1.81
+++ LVM2/daemons/clvmd/clvmd.c	2010/10/27 11:40:14	1.82
@@ -188,6 +188,14 @@
 	        exit(status);
 }
 
+static void safe_close(int *fd)
+{
+	if (*fd >= 0) {
+		int to_close = *fd;
+		*fd = -1;
+		close(to_close);
+	}
+}
 
 void debuglog(const char *fmt, ...)
 {
@@ -838,10 +846,7 @@
 						lastfd->next = thisfd->next;
 						free_fd = thisfd;
 						thisfd = lastfd;
-						if (free_fd->fd >= 0) {
-							close(free_fd->fd);
-							free_fd->fd = -1;
-						}
+						safe_close(&(free_fd->fd));
 
 						/* Queue cleanup, this also frees the client struct */
 						add_to_lvmqueue(free_fd, NULL, 0, NULL);
@@ -1091,10 +1096,7 @@
 			thisfd->bits.localsock.pipe_client->bits.pipe.client =
 			    NULL;
 
-		if (thisfd->fd >= 0) {
-			close(thisfd->fd);
-			thisfd->fd = -1;
-		}
+		safe_close(&(thisfd->fd));
 		return 0;
 	} else {
 		int comms_pipe[2];




More information about the lvm-devel mailing list