LVM2/daemons/clvmd clvmd.c

[email protected] <[email protected]>
Newsgroups dev.linux.lists.lvm-devel
Message-ID <[email protected]>
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];
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.