Commit Message
The test spawns two children but only waited for one.
2017-09-27 Szabolcs Nagy <szabolcs.nagy@arm.com>
* posix/tst-spawn.c (do_test): Wait for both children.
Comments
On 09/27/2017 02:56 PM, Szabolcs Nagy wrote:
> + /* Wait for the child. */
> + if (waitpid (pid, &status, 0) != pid)
> + error (EXIT_FAILURE, errno, "wrong child");
You could use
TEST_VERIFY (xwaitpid (pid, &status, 0) != pid));
instead.
In fact, all the error calls are invalid in tests because they write to
standard error.
So perhaps use
TEST_VERIFY (WIFEXITED (status));
TEST_VERIFY (!WIFSIGNALED (status));
TEST_VERIFY (WEXITSTATUS (status) == 0);
The error messages did not contain the status bits anyway, so this is
not a regression as far as diagnostics are concerned.
The existing WTERMSIG check is invalid because !WIFSIGNALED (status).
Thanks,
Florian
@@ -240,22 +240,30 @@ do_test (int argc, char *argv[])
if (posix_spawn (&pid, argv[1], &actions, NULL, spargv, environ) != 0)
error (EXIT_FAILURE, errno, "posix_spawn");
+ /* Wait for the child. */
+ if (waitpid (pid, &status, 0) != pid)
+ error (EXIT_FAILURE, errno, "wrong child");
+ if (WTERMSIG (status) != 0)
+ error (EXIT_FAILURE, 0, "Child terminated incorrectly");
+ if (WEXITSTATUS (status) != 0)
+ error (EXIT_FAILURE, 0, "Child failed");
+
/* Same test but with a NULL pid argument. */
if (posix_spawn (NULL, argv[1], &actions, NULL, spargv, environ) != 0)
error (EXIT_FAILURE, errno, "posix_spawn");
+ /* Wait for the child. */
+ if (waitpid (-1, &status, 0) == -1)
+ error (EXIT_FAILURE, errno, "waitpid failed");
+ if (WTERMSIG (status) != 0)
+ error (EXIT_FAILURE, 0, "Child terminated incorrectly");
+ if (WEXITSTATUS (status) != 0)
+ error (EXIT_FAILURE, 0, "Child failed");
+
/* Cleanup. */
if (posix_spawn_file_actions_destroy (&actions) != 0)
error (EXIT_FAILURE, errno, "posix_spawn_file_actions_destroy");
free (name3_copy);
- /* Wait for the child. */
- if (waitpid (pid, &status, 0) != pid)
- error (EXIT_FAILURE, errno, "wrong child");
-
- if (WTERMSIG (status) != 0)
- error (EXIT_FAILURE, 0, "Child terminated incorrectly");
- status = WEXITSTATUS (status);
-
- return status;
+ return 0;
}