Author: trasz
Date: Tue Jan 12 10:24:08 2016
New Revision: 293747
URL: https://svnweb.freebsd.org/changeset/base/293747

Log:
  MFC r290689:
  
  Fix resource leaks in error cases.
  
  Sponsored by: The FreeBSD Foundation

Modified:
  stable/10/sbin/init/init.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sbin/init/init.c
==============================================================================
--- stable/10/sbin/init/init.c  Tue Jan 12 10:19:56 2016        (r293746)
+++ stable/10/sbin/init/init.c  Tue Jan 12 10:24:08 2016        (r293747)
@@ -660,6 +660,7 @@ read_file(const char *path, void **bufp,
        error = fstat(fd, &sb);
        if (error != 0) {
                emergency("fstat: %s", strerror(errno));
+               close(fd);
                return (error);
        }
 
@@ -667,12 +668,14 @@ read_file(const char *path, void **bufp,
        buf = malloc(bufsize);
        if (buf == NULL) {
                emergency("malloc: %s", strerror(errno));
+               close(fd);
                return (error);
        }
 
        nbytes = read(fd, buf, bufsize);
        if (nbytes != (ssize_t)bufsize) {
                emergency("read: %s", strerror(errno));
+               close(fd);
                free(buf);
                return (error);
        }
@@ -691,7 +694,7 @@ read_file(const char *path, void **bufp,
 }
 
 static int
-create_file(const char *path, void *buf, size_t bufsize)
+create_file(const char *path, const void *buf, size_t bufsize)
 {
        ssize_t nbytes;
        int error, fd;
@@ -705,13 +708,13 @@ create_file(const char *path, void *buf,
        nbytes = write(fd, buf, bufsize);
        if (nbytes != (ssize_t)bufsize) {
                emergency("write: %s", strerror(errno));
+               close(fd);
                return (-1);
        }
 
        error = close(fd);
        if (error != 0) {
                emergency("close: %s", strerror(errno));
-               free(buf);
                return (-1);
        }
 
@@ -757,6 +760,9 @@ reroot(void)
        size_t bufsize, init_path_len;
        int error, name[4];
 
+       buf = NULL;
+       bufsize = 0;
+
        name[0] = CTL_KERN;
        name[1] = KERN_PROC;
        name[2] = KERN_PROC_PATHNAME;
@@ -782,12 +788,6 @@ reroot(void)
        }
 
        /*
-        * Pacify GCC.
-        */
-       buf = NULL;
-       bufsize = 0;
-
-       /*
         * Copy the init binary into tmpfs, so that we can unmount
         * the old rootfs without committing suicide.
         */
@@ -809,6 +809,7 @@ reroot(void)
 
 out:
        emergency("reroot failed; going to single user mode");
+       free(buf);
        return (state_func_t) single_user;
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to