Module Name:    src
Committed By:   tnn
Date:           Sat Nov  2 18:14:36 UTC 2019

Modified Files:
        src/lib/libpuffs: null.c

Log Message:
puffs_null_node_fsync: don't leak directory handle

Directory handles returned by opendir must be closed by closedir.
Also directory(3) says we mustn't close(2) descriptors returned by dirfd(3)


To generate a diff of this commit:
cvs rdiff -u -r1.34 -r1.35 src/lib/libpuffs/null.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libpuffs/null.c
diff -u src/lib/libpuffs/null.c:1.34 src/lib/libpuffs/null.c:1.35
--- src/lib/libpuffs/null.c:1.34	Mon Sep 23 12:00:57 2019
+++ src/lib/libpuffs/null.c	Sat Nov  2 18:14:36 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: null.c,v 1.34 2019/09/23 12:00:57 christos Exp $	*/
+/*	$NetBSD: null.c,v 1.35 2019/11/02 18:14:36 tnn Exp $	*/
 
 /*
  * Copyright (c) 2007  Antti Kantee.  All Rights Reserved.
@@ -27,7 +27,7 @@
 
 #include <sys/cdefs.h>
 #if !defined(lint)
-__RCSID("$NetBSD: null.c,v 1.34 2019/09/23 12:00:57 christos Exp $");
+__RCSID("$NetBSD: null.c,v 1.35 2019/11/02 18:14:36 tnn Exp $");
 #endif /* !lint */
 
 /*
@@ -412,20 +412,25 @@ puffs_null_node_fsync(struct puffs_userm
 	int fd, rv;
 	int fflags;
 	struct stat sb;
+	DIR *dirp;
 
 	rv = 0;
 	if (stat(PNPATH(pn), &sb) == -1)
 		return errno;
 	if (S_ISDIR(sb.st_mode)) {
-		DIR *dirp;
-		if ((dirp = opendir(PNPATH(pn))) == 0)
+		if ((dirp = opendir(PNPATH(pn))) == NULL)
 			return errno;
 		fd = dirfd(dirp);
-		if (fd == -1)
-			return errno;
+		if (fd == -1) {
+			rv = errno;
+			closedir(dirp);
+			return rv;
+		}
 
 		if (fsync(fd) == -1)
 			rv = errno;
+
+		closedir(dirp);
 	} else {
 		fd = writeableopen(PNPATH(pn));
 		if (fd == -1)
@@ -440,9 +445,9 @@ puffs_null_node_fsync(struct puffs_userm
 
 		if (fsync_range(fd, fflags, offlo, offhi - offlo) == -1)
 			rv = errno;
-	}
 
-	close(fd);
+		close(fd);
+	}
 
 	return rv;
 }

Reply via email to