Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libpuffs puffs_null_node_fsync: don't leak directory handle



details:   https://anonhg.NetBSD.org/src/rev/6312bfbfe76b
branches:  trunk
changeset: 966529:6312bfbfe76b
user:      tnn <tnn%NetBSD.org@localhost>
date:      Sat Nov 02 18:14:36 2019 +0000

description:
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)

diffstat:

 lib/libpuffs/null.c |  21 +++++++++++++--------
 1 files changed, 13 insertions(+), 8 deletions(-)

diffs (61 lines):

diff -r 4362abfeaa6f -r 6312bfbfe76b lib/libpuffs/null.c
--- a/lib/libpuffs/null.c       Sat Nov 02 17:13:20 2019 +0000
+++ b/lib/libpuffs/null.c       Sat Nov 02 18:14:36 2019 +0000
@@ -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 @@
        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,10 +445,10 @@
 
                if (fsync_range(fd, fflags, offlo, offhi - offlo) == -1)
                        rv = errno;
+
+               close(fd);
        }
 
-       close(fd);
-
        return rv;
 }
 



Home | Main Index | Thread Index | Old Index