Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Nov 2015 23:00:57 +0000 (UTC)
From:      Edward Tomasz Napierala <trasz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r290689 - head/sbin/init
Message-ID:  <201511112300.tABN0wqT078125@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: trasz
Date: Wed Nov 11 23:00:57 2015
New Revision: 290689
URL: https://svnweb.freebsd.org/changeset/base/290689

Log:
  Fix resource leaks in error cases.
  
  MFC after:	1 month
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/sbin/init/init.c

Modified: head/sbin/init/init.c
==============================================================================
--- head/sbin/init/init.c	Wed Nov 11 18:56:21 2015	(r290688)
+++ head/sbin/init/init.c	Wed Nov 11 23:00:57 2015	(r290689)
@@ -659,6 +659,7 @@ read_file(const char *path, void **bufp,
 	error = fstat(fd, &sb);
 	if (error != 0) {
 		emergency("fstat: %s", strerror(errno));
+		close(fd);
 		return (error);
 	}
 
@@ -666,12 +667,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);
 	}
@@ -690,7 +693,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;
@@ -704,13 +707,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);
 	}
 
@@ -756,6 +759,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;
@@ -781,12 +787,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.
 	 */
@@ -808,6 +808,7 @@ reroot(void)
 
 out:
 	emergency("reroot failed; going to single user mode");
+	free(buf);
 	return (state_func_t) single_user;
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201511112300.tABN0wqT078125>