]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Check waitpid return value and exit status in tinytest.c
authorNick Mathewson <nickm@torproject.org>
Wed, 12 Sep 2018 12:57:18 +0000 (08:57 -0400)
committerNick Mathewson <nickm@torproject.org>
Wed, 12 Sep 2018 12:57:18 +0000 (08:57 -0400)
It's possible for a unit test to report success via its pipe, but to
fail as it tries to clean up and exit.  Notably, this happens on a
leak sanitizer failure.

Fixes bug 27658; bugfix on 0.2.2.4-alpha when tinytest was
introduced.

changes/bug27658 [new file with mode: 0644]
src/ext/tinytest.c

diff --git a/changes/bug27658 b/changes/bug27658
new file mode 100644 (file)
index 0000000..8cc0aa4
--- /dev/null
@@ -0,0 +1,6 @@
+  o Minor bugfixes (testing):
+    - If a unit test running in a subprocess exits abnormally or with a
+      nonzero status code, treat the test as having failed, even if
+      the test reported success. Without this fix, memory leaks don't cause
+      cause the tests to fail, even with LeakSanitizer. Fixes bug 27658;
+      bugfix on 0.2.2.4-alpha.
index 3fb1b39c718cbad3ed1018d2bd4a135bbbe57a31..a51cd6011a1592cb06d84db61e904f3331d84213 100644 (file)
@@ -207,12 +207,20 @@ testcase_run_forked_(const struct testgroup_t *group,
                r = (int)read(outcome_pipe[0], b, 1);
                if (r == 0) {
                        printf("[Lost connection!] ");
-                       return 0;
+                       return FAIL;
                } else if (r != 1) {
                        perror("read outcome from pipe");
                }
-               waitpid(pid, &status, 0);
+               r = waitpid(pid, &status, 0);
                close(outcome_pipe[0]);
+               if (r == -1) {
+                       perror("waitpid");
+                       return FAIL;
+               }
+                if (! WIFEXITED(status) || WEXITSTATUS(status) != 0) {
+                       printf("[did not exit cleanly.]");
+                       return FAIL;
+                }
                return b[0]=='Y' ? OK : (b[0]=='S' ? SKIP : FAIL);
        }
 #endif