[CRIU] [PATCH] Migration with vfork. Fail expected.
Pavel Emelyanov
xemul at parallels.com
Wed Nov 25 05:53:58 PST 2015
On 11/25/2015 04:42 PM, Pavel Ganyushin wrote:
> This is old missed test.
This test will be automatically picked up by zdtm.py and
everything would fail (or more precisely -- get stuck).
Plz, add the .desc file to this test with 'noauto' flag.
> Signed-off-by: Pavel Ganyushin <pganyushin at odin.com>
> ---
> test/zdtm/live/static/vfork00.c | 80 +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 80 insertions(+)
> create mode 100644 test/zdtm/live/static/vfork00.c
>
> diff --git a/test/zdtm/live/static/vfork00.c b/test/zdtm/live/static/vfork00.c
> new file mode 100644
> index 0000000..8a54def
> --- /dev/null
> +++ b/test/zdtm/live/static/vfork00.c
> @@ -0,0 +1,80 @@
> +#include <errno.h>
> +#include <unistd.h>
> +#include <fcntl.h>
> +#include <stdlib.h>
> +#include <sys/types.h>
> +#include <sys/wait.h>
> +#include <signal.h>
> +#include <string.h>
> +
> +#include "zdtmtst.h"
> +
> +const char *test_doc = "Block migration by a pending (non-exec()-ed) vfork()";
> +const char *test_author = "Pavel Emelianov <xemul at sw.ru>";
> +
> +int main(int argc, char ** argv)
> +{
> + int ret = 0;
> + pid_t pid;
> +
> + test_init(argc, argv);
> +
> + /* vfork() won't let us control the test, so fork() first, and vfork()
> + * in the child */
> + pid = fork();
> + if (pid < 0) {
> + err("fork failed: %m");
> + exit(1);
> + }
> +
> + if (pid == 0) {
> + int ret2;
> +
> + pid = vfork();
> + if (pid < 0)
> + ret = errno;
> +
> + /* wait for signal in _both_ branches */
> + test_waitsig();
> +
> + /* vforked guy shouldn't return, hence we exec() */
> + if (pid == 0)
> + execlp("/bin/true", "true", NULL);
> +
> + if (wait(&ret2) != pid)
> + ret = errno;
> +
> + _exit(ret);
> + }
> +
> + test_daemon();
> + test_waitsig();
> +
> + /* signal the whole process group, because our child is suspended until
> + * the grand-child has exec()-ed, but we don't know the pid of the
> + * latter */
> + if (kill(0, SIGTERM)) {
> + fail("terminating the children failed: %m");
> + exit(1);
> + }
> +
> + if (wait(&ret) != pid) {
> + fail("wait() returned wrong pid: %m");
> + exit(1);
> + }
> +
> + if (WIFEXITED(ret)) {
> + ret = WEXITSTATUS(ret);
> + if (ret) {
> + fail("child exited with nonzero code %d (%s)", ret, strerror(ret));
> + exit(1);
> + }
> + }
> + if (WIFSIGNALED(ret)) {
> + fail("child exited on unexpected signal %d", WTERMSIG(ret));
> + exit(1);
> + }
> +
> + pass();
> + return 0;
> +}
>
More information about the CRIU
mailing list