1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-10-19 02:29:40 +00:00

Fix resource leaks in error cases.

MFC after:	1 month
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
Edward Tomasz Napierala 2015-11-11 23:00:57 +00:00
parent 28a0666622
commit b9124fc313
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=290689

View File

@ -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;
@ -780,12 +786,6 @@ reroot(void)
goto out;
}
/*
* 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;
}