]> granicus.if.org Git - graphviz/commitdiff
fix Lefty's reliance on dup() internals smattr/91908b3f-1fea-401e-a238-435c742d3589
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 10 Oct 2020 22:36:52 +0000 (15:36 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 17 Oct 2020 00:10:07 +0000 (17:10 -0700)
This addresses the following Coverity warnings:

  Error: RESOURCE_LEAK (CWE-772): [#def39]
  graphviz-2.40.1/cmd/lefty/os/unix/io.c:362: open_fn: Returning handle opened by "dup".
  graphviz-2.40.1/cmd/lefty/os/unix/io.c:362: leaked_handle: Failing to save or close handle opened by "dup(fd[1])" leaks it.
  #  360|           panic2 (POS, "ptyopen", "cannot fork");
  #  361|       case 0:
  #  362|->         close (fd[0]), close (0), dup (fd[1]);
  #  363|           close (1), dup (fd[1]), close (fd[1]);
  #  364|           execl (shell, shbname, "-c", cmd, NULL);

  Error: RESOURCE_LEAK (CWE-772): [#def40]
  graphviz-2.40.1/cmd/lefty/os/unix/io.c:363: open_fn: Returning handle opened by "dup".
  graphviz-2.40.1/cmd/lefty/os/unix/io.c:363: leaked_handle: Failing to save or close handle opened by "dup(fd[1])" leaks it.
  #  361|       case 0:
  #  362|           close (fd[0]), close (0), dup (fd[1]);
  #  363|->         close (1), dup (fd[1]), close (fd[1]);
  #  364|           execl (shell, shbname, "-c", cmd, NULL);
  #  365|           panic2 (POS, "ptyopen", "child cannot exec: %s\n", cmd);

  Error: RESOURCE_LEAK (CWE-772): [#def41]
  graphviz-2.40.1/cmd/lefty/os/unix/io.c:429: open_fn: Returning handle opened by "dup".
  graphviz-2.40.1/cmd/lefty/os/unix/io.c:429: leaked_handle: Failing to save or close handle opened by "dup(p1[1])" leaks it.
  #  427|                   panic2 (POS, "pipeopen", "child cannot exec: %s\n", cmd2);
  #  428|               }
  #  429|->         close (1), dup (p1[1]), close (p1[1]);
  #  430|           close (0), dup (p2[0]), close (p2[0]);
  #  431|           execl (shell, shbname, "-c", cmd, NULL);

  Error: RESOURCE_LEAK (CWE-772): [#def42]
  graphviz-2.40.1/cmd/lefty/os/unix/io.c:430: open_fn: Returning handle opened by "dup".
  graphviz-2.40.1/cmd/lefty/os/unix/io.c:430: leaked_handle: Failing to save or close handle opened by "dup(p2[0])" leaks it.
  #  428|               }
  #  429|           close (1), dup (p1[1]), close (p1[1]);
  #  430|->         close (0), dup (p2[0]), close (p2[0]);
  #  431|           execl (shell, shbname, "-c", cmd, NULL);
  #  432|           panic2 (POS, "pipeopen", "child cannot exec: %s\n", cmd);

Fixes #1823. Related to #1464.

CHANGELOG.md
cmd/lefty/os/unix/io.c

index c8a7bf6dd4894c91bd6270fe57d8d2cfe97a40b9..46a1cc67105b490e662ca8434a413c0e1a7ed1a5 100644 (file)
@@ -60,6 +60,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Graphviz doesn't build on MacOS with the latest libc++ #1785
 - make fails if ps2pdf is not installed (using autotools) #1763
 - multiple graphs to file output causes a segfault #1845
+- lefty PTY functionality relies on file descriptor implementation details #1823
 
 ## [2.44.1] - 2020-06-29
 
index dba142959f773e2e964be99084be25b6dd9b851c..df10d9bd65189b3a1c84288aaec608f050bbdf58 100644 (file)
@@ -359,8 +359,8 @@ static void ptyopen (char *cmd, FILE **ifp, FILE **ofp, int *pidp) {
     case -1:
         panic2 (POS, "ptyopen", "cannot fork");
     case 0:
-        close (fd[0]), close (0), dup (fd[1]);
-        close (1), dup (fd[1]), close (fd[1]);
+        close (fd[0]), dup2 (fd[1], 0);
+        dup2 (fd[1], 1), close (fd[1]);
         execl (shell, shbname, "-c", cmd, NULL);
         panic2 (POS, "ptyopen", "child cannot exec: %s\n", cmd);
     default:
@@ -426,8 +426,8 @@ static void pipeopen (char *cmd, FILE **ifp, FILE **ofp, int *pidp) {
                 execl (shell, shbname, "-c", cmd2, NULL);
                 panic2 (POS, "pipeopen", "child cannot exec: %s\n", cmd2);
             }
-        close (1), dup (p1[1]), close (p1[1]);
-        close (0), dup (p2[0]), close (p2[0]);
+        dup2 (p1[1], 1), close (p1[1]);
+        dup2 (p2[0], 0), close (p2[0]);
         execl (shell, shbname, "-c", cmd, NULL);
         panic2 (POS, "pipeopen", "child cannot exec: %s\n", cmd);
     default: