]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
tests: (lsfd) fix file descriptor leaks reported by coverity
authorMasatake YAMATO <yamato@redhat.com>
Mon, 29 Nov 2021 14:04:04 +0000 (23:04 +0900)
committerMasatake YAMATO <yamato@redhat.com>
Mon, 29 Nov 2021 14:14:58 +0000 (23:14 +0900)
The oldfd argument of dup2 is not closed automatically.
It must be closed explicitly.

Close #1517.

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
tests/helpers/test_mkfds.c

index aa96ac79c6c68b8dbf2c8ea4b292f4f1fd813759..db6e92fdb61d9d3ad7fd4b8de45d6c8d6e6e6058 100644 (file)
@@ -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,