diff options
author | Nick Mathewson <nickm@torproject.org> | 2018-09-12 08:57:18 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2018-09-12 08:57:18 -0400 |
commit | 73a37d1e547d996515e2a0ffea8331bb535d2841 (patch) | |
tree | 8b093a8bba5ebf4eab4dcf3188a88125932b12d6 /src/ext | |
parent | 198b6354e6c58ab4276461b5215487b8e9c15683 (diff) | |
download | tor-73a37d1e547d996515e2a0ffea8331bb535d2841.tar.gz tor-73a37d1e547d996515e2a0ffea8331bb535d2841.zip |
Check waitpid return value and exit status in tinytest.c
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.
Diffstat (limited to 'src/ext')
-rw-r--r-- | src/ext/tinytest.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/ext/tinytest.c b/src/ext/tinytest.c index 3fb1b39c71..a51cd6011a 100644 --- a/src/ext/tinytest.c +++ b/src/ext/tinytest.c @@ -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 |