From: Masatake YAMATO Date: Mon, 29 Nov 2021 14:04:04 +0000 (+0900) Subject: tests: (lsfd) fix file descriptor leaks reported by coverity X-Git-Tag: v2.38-rc1~125^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3ebd593974780fa8be234e9716b15ddfa8db094b;p=thirdparty%2Futil-linux.git tests: (lsfd) fix file descriptor leaks reported by coverity The oldfd argument of dup2 is not closed automatically. It must be closed explicitly. Close #1517. Signed-off-by: Masatake YAMATO --- diff --git a/tests/helpers/test_mkfds.c b/tests/helpers/test_mkfds.c index aa96ac79c6..db6e92fdb6 100644 --- a/tests/helpers/test_mkfds.c +++ b/tests/helpers/test_mkfds.c @@ -245,11 +245,14 @@ static void open_ro_regular_file(const struct factory *factory, struct fdesc fde } free_arg(&offset); - if (dup2(fd, fdescs[0].fd) < 0) { - int e = errno; + if (fd != fdescs[0].fd) { + if (dup2(fd, fdescs[0].fd) < 0) { + int e = errno; + close(fd); + errno = e; + err(EXIT_FAILURE, "failed to dup %d -> %d", fd, fdescs[0].fd); + } close(fd); - errno = e; - err(EXIT_FAILURE, "failed to dup %d -> %d", fd, fdescs[0].fd); } fdescs[0] = (struct fdesc){ @@ -302,13 +305,16 @@ static void make_pipe(const struct factory *factory, struct fdesc fdescs[], pid_ } for (int i = 0; i < 2; i++) { - if (dup2(pd[i], fdescs[i].fd) < 0) { - int e = errno; - close(pd[0]); - close(pd[1]); - errno = e; - err(EXIT_FAILURE, "failed to dup %d -> %d", - pd[i], fdescs[i].fd); + if (pd[i] != fdescs[i].fd) { + if (dup2(pd[i], fdescs[i].fd) < 0) { + int e = errno; + close(pd[0]); + close(pd[1]); + errno = e; + err(EXIT_FAILURE, "failed to dup %d -> %d", + pd[i], fdescs[i].fd); + } + close(pd[i]); } fdescs[i] = (struct fdesc){ .fd = fdescs[i].fd, @@ -339,11 +345,14 @@ static void open_directory(const struct factory *factory, struct fdesc fdescs[], err(EXIT_FAILURE, "failed to open: %s", ARG_STRING(dir)); free_arg(&dir); - if (dup2(fd, fdescs[0].fd) < 0) { - int e = errno; + if (fd != fdescs[0].fd) { + if (dup2(fd, fdescs[0].fd) < 0) { + int e = errno; + close(fd); + errno = e; + err(EXIT_FAILURE, "failed to dup %d -> %d", fd, fdescs[0].fd); + } close(fd); - errno = e; - err(EXIT_FAILURE, "failed to dup %d -> %d", fd, fdescs[0].fd); } if (ARG_INTEGER(dentries) > 0) { @@ -412,13 +421,16 @@ static void make_socketpair(const struct factory *factory, struct fdesc fdescs[] err(EXIT_FAILURE, "failed to make socket pair"); for (int i = 0; i < 2; i++) { - if (dup2(sd[i], fdescs[i].fd) < 0) { - int e = errno; - close(sd[0]); - close(sd[1]); - errno = e; - err(EXIT_FAILURE, "failed to dup %d -> %d", - sd[i], fdescs[i].fd); + if (sd[i] != fdescs[i].fd) { + if (dup2(sd[i], fdescs[i].fd) < 0) { + int e = errno; + close(sd[0]); + close(sd[1]); + errno = e; + err(EXIT_FAILURE, "failed to dup %d -> %d", + sd[i], fdescs[i].fd); + } + close(sd[i]); } fdescs[i] = (struct fdesc){ .fd = fdescs[i].fd,