diff options
author | trasz <trasz@FreeBSD.org> | 2015-11-11 23:00:57 +0000 |
---|---|---|
committer | trasz <trasz@FreeBSD.org> | 2015-11-11 23:00:57 +0000 |
commit | 709fe262d8464a172e5323c6d788535be1f5d21c (patch) | |
tree | 8b47ad01e38ff6c0392f753ad1e1a56d3316e4f0 /sbin/init | |
parent | ca58bba318fd8bdebd40eaa3b4e8bb354887c077 (diff) | |
download | FreeBSD-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/init')
-rw-r--r-- | sbin/init/init.c | 17 |
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; } |