From patchwork Mon Jan 28 14:15:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Stefan Liebler X-Patchwork-Id: 31229 Received: (qmail 81726 invoked by alias); 28 Jan 2019 14:15:33 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 81564 invoked by uid 89); 28 Jan 2019 14:15:27 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KHOP_DYNAMIC, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=Bye X-HELO: mx0a-001b2d01.pphosted.com Subject: Re: [PATCH] posix/tst-spawn: Fix racy tests in spawned processes. To: libc-alpha@sourceware.org References: Cc: "Carlos O'Donell" From: Stefan Liebler Date: Mon, 28 Jan 2019 15:15:10 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: x-cbid: 19012814-0016-0000-0000-0000024BE595 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 19012814-0017-0000-0000-000032A5ECFA Message-Id: On 01/28/2019 02:41 PM, Stefan Liebler wrote: > Hi, > > from time to time I get fails in tst-spawn like: > tst-spawn.c:111: numeric comparison failure >    left: 0 (0x0); from: xlseek (fd2, 0, SEEK_CUR) >   right: 28 (0x1c); from: strlen (fd2string) > error: 1 test failures > tst-spawn.c:252: numeric comparison failure >    left: 1 (0x1); from: WEXITSTATUS (status) >   right: 0 (0x0); from: 0 > error: 1 test failures > > It turned out, that a child process is testing it's open file > descriptors with e.g. a sequence of testing the current position, > setting the position to zero and reading a specific amount of bytes. > > Unfortunately starting with commit > 2a69f853c03034c2e383e0f9c35b5402ce8b5473 the test is spawning a second > child process which is sharing some of the file descriptors.  If the > test sequence as mentioned above is running in parallel it leads to test > failures. > > As the second call of posix_spawn shall test a NULL pid argument, this > patch is just moving the waitpid of the first child before the > posix_spawn of the second child. > > Okay for commit? > (I assume 2.30) > > Bye, > Stefan > > ChangeLog: > >     * posix/tst-spawn do_test(): Move waitpid before posix_spawn. > Sorry. Forgot to attach the patch. commit b6b802488e1c04b0de9235580538f295b1264541 Author: Stefan Liebler Date: Mon Jan 28 14:16:55 2019 +0100 posix/tst-spawn: Fix racy tests in spawned processes. From time to time I get fails in tst-spawn like: tst-spawn.c:111: numeric comparison failure left: 0 (0x0); from: xlseek (fd2, 0, SEEK_CUR) right: 28 (0x1c); from: strlen (fd2string) error: 1 test failures tst-spawn.c:252: numeric comparison failure left: 1 (0x1); from: WEXITSTATUS (status) right: 0 (0x0); from: 0 error: 1 test failures It turned out, that a child process is testing it's open file descriptors with e.g. a sequence of testing the current position, setting the position to zero and reading a specific amount of bytes. Unfortunately starting with commit 2a69f853c03034c2e383e0f9c35b5402ce8b5473 the test is spawning a second child process which is sharing some of the file descriptors. If the test sequence as mentioned above is running in parallel it leads to test failures. As the second call of posix_spawn shall test a NULL pid argument, this patch is just moving the waitpid of the first child before the posix_spawn of the second child. ChangeLog: * posix/tst-spawn do_test(): Move waitpid before posix_spawn. diff --git a/posix/tst-spawn.c b/posix/tst-spawn.c index eea5addbf3..9aa7e621e6 100644 --- a/posix/tst-spawn.c +++ b/posix/tst-spawn.c @@ -237,6 +237,12 @@ do_test (int argc, char *argv[]) TEST_COMPARE (posix_spawn (&pid, argv[1], &actions, NULL, spargv, environ), 0); + /* Wait for the children. */ + TEST_COMPARE (xwaitpid (pid, &status, 0), pid); + TEST_VERIFY (WIFEXITED (status)); + TEST_VERIFY (!WIFSIGNALED (status)); + TEST_COMPARE (WEXITSTATUS (status), 0); + /* Same test but with a NULL pid argument. */ TEST_COMPARE (posix_spawn (NULL, argv[1], &actions, NULL, spargv, environ), 0); @@ -246,11 +252,6 @@ do_test (int argc, char *argv[]) free (name3_copy); /* Wait for the children. */ - TEST_COMPARE (xwaitpid (pid, &status, 0), pid); - TEST_VERIFY (WIFEXITED (status)); - TEST_VERIFY (!WIFSIGNALED (status)); - TEST_COMPARE (WEXITSTATUS (status), 0); - xwaitpid (-1, &status, 0); TEST_VERIFY (WIFEXITED (status)); TEST_VERIFY (!WIFSIGNALED (status));