summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authortrasz <trasz@FreeBSD.org>2015-11-11 23:00:57 +0000
committertrasz <trasz@FreeBSD.org>2015-11-11 23:00:57 +0000
commit709fe262d8464a172e5323c6d788535be1f5d21c (patch)
tree8b47ad01e38ff6c0392f753ad1e1a56d3316e4f0 /sbin
parentca58bba318fd8bdebd40eaa3b4e8bb354887c077 (diff)
downloadFreeBSD-src-709fe262d8464a172e5323c6d788535be1f5d21c.zip
FreeBSD-src-709fe262d8464a172e5323c6d788535be1f5d21c.tar.gz
Fix resource leaks in error cases.
MFC after: 1 month Sponsored by: The FreeBSD Foundation
Diffstat (limited to 'sbin')
-rw-r--r--sbin/init/init.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/sbin/init/init.c b/sbin/init/init.c
index 0826507..0827f33 100644
--- a/sbin/init/init.c
+++ b/sbin/init/init.c
@@ -659,6 +659,7 @@ read_file(const char *path, void **bufp, size_t *bufsizep)
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, size_t *bufsizep)
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, size_t *bufsizep)
}
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, size_t bufsize)
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;
}
OpenPOWER on IntegriCloud