From patchwork Fri Jun 11 17:24:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 43841 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8CF2338618D9 for ; Fri, 11 Jun 2021 17:25:06 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8CF2338618D9 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1623432306; bh=CSwYP5S8Ju51KmdTCH4aKF8etG8kvy4J8Sd4TveG/Os=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=IyvWrCkg5pLPMDSUTnxBNO5H1UYs4ETT0Qpz0J6c07bN3XMG3A0cuRJUMB0U0Uv2E 8mV44WJvh0lQZjaiU93QFfeV8iZ56RN9BElXyHO7oUUtTSVn7ZfB8y64TxICpUvded C9yTh6P8ebYdXANZJlG9iWQrp5EZbSknUkFIaV5E= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-qt1-x830.google.com (mail-qt1-x830.google.com [IPv6:2607:f8b0:4864:20::830]) by sourceware.org (Postfix) with ESMTPS id A8EDB3855004 for ; Fri, 11 Jun 2021 17:24:44 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A8EDB3855004 Received: by mail-qt1-x830.google.com with SMTP id a15so3127563qtx.13 for ; Fri, 11 Jun 2021 10:24:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=CSwYP5S8Ju51KmdTCH4aKF8etG8kvy4J8Sd4TveG/Os=; b=S3sB6YrGJotIpYaQsG7Y3AZe8Isz9JD6fyz69h1CZ4K7MVDg1HjHgzjEzqO+Cr3zB8 byCdItiJKDe/lO9KGj3GRjpaZKLLcgw3NGXLTkCGkYFWaoPIncPdn/7IB1aY9OoC4Ylc eOnTNk25R4EXzzJOlJ9h9uG0+Hm3/w7wKN11SQGRqFe/Sxi6AN9ac8x5kNdCcPCgjLJd a73pzBYcS9ti7mJJGI4cOGPKVLjTmX9zpMYoDIOWttHTf4XovxTZ7l0uAxSjzBnz/Y+L WJ+93U9t3B3AtrqW3pEkJ8xIdfKyapV3FxjhEO4qGxZFn2yzeyLeAef5FTjKK+bbqYV3 yBrw== X-Gm-Message-State: AOAM532m6657lQ+oCrOqXcY293al7E41L3+YaXAP2jzvBV7e9bUv8w7k v/hhszN0nFaG5mssbGKS0CNCm+Kc+pVaOA== X-Google-Smtp-Source: ABdhPJxrcYDVH3bVZa8gvd07vfeW3GFOsuL/ZEZkBzgFpt89i/T6VHnE/RYXeF3pjFHcfR034WBDGQ== X-Received: by 2002:ac8:4997:: with SMTP id f23mr4942291qtq.94.1623432284003; Fri, 11 Jun 2021 10:24:44 -0700 (PDT) Received: from birita.. ([177.194.59.218]) by smtp.googlemail.com with ESMTPSA id m7sm4994480qki.79.2021.06.11.10.24.42 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Jun 2021 10:24:43 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH v2 1/6] nptl: Fix tst-cancel7 and tst-cancelx7 race condition (BZ #14232) Date: Fri, 11 Jun 2021 14:24:39 -0300 Message-Id: <20210611172439.248245-1-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <875yyksagv.fsf@oldenburg.str.redhat.com> References: <875yyksagv.fsf@oldenburg.str.redhat.com> MIME-Version: 1.0 X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" A mapped temporary file and a semaphore is used to synchronize the pid information on the created file, the semaphore is updated once the file contents is flushed. Checked on x86_64-linux-gnu. --- nptl/Makefile | 2 + nptl/tst-cancel7.c | 114 ++++++++++++++++++++++----------------------- 2 files changed, 59 insertions(+), 57 deletions(-) diff --git a/nptl/Makefile b/nptl/Makefile index 3e6cf0c21b..0ad9e24b0f 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -539,6 +539,8 @@ else librt = $(common-objpfx)rt/librt.a endif +$(objpfx)tst-cancel7: $(librt) +$(objpfx)tst-cancelx7: $(librt) $(objpfx)tst-cancel17: $(librt) $(objpfx)tst-cancelx17: $(librt) diff --git a/nptl/tst-cancel7.c b/nptl/tst-cancel7.c index 7a1870ac74..e3d037530c 100644 --- a/nptl/tst-cancel7.c +++ b/nptl/tst-cancel7.c @@ -18,44 +18,48 @@ #include #include -#include +#include #include -#include #include -#include -#include -#include - +#include +#include + +#include +#include +#include +#include +#include #include -const char *command; -const char *pidfile; -char pidfilename[] = "/tmp/tst-cancel7-XXXXXX"; +static const char *command; +static const char *pidfile; +static const char *semfile; +static char *pidfilename; +static char *semfilename; + +static sem_t *sem; static void * tf (void *arg) { - const char *args = " --direct --pidfile "; - char *cmd = alloca (strlen (command) + strlen (args) - + strlen (pidfilename) + 1); - - strcpy (stpcpy (stpcpy (cmd, command), args), pidfilename); + char *cmd = xasprintf ("%s --direct --sem %s --pidfile %s", + command, semfilename, pidfilename); system (cmd); /* This call should never return. */ return NULL; } - static void sl (void) { - FILE *f = fopen (pidfile, "w"); - if (f == NULL) - exit (1); + FILE *f = xfopen (pidfile, "w"); fprintf (f, "%lld\n", (long long) getpid ()); fflush (f); + if (sem_post (sem) != 0) + FAIL_EXIT1 ("sem_post: %m"); + struct flock fl = { .l_type = F_WRLCK, @@ -64,7 +68,7 @@ sl (void) .l_len = 1 }; if (fcntl (fileno (f), F_SETLK, &fl) != 0) - exit (1); + FAIL_EXIT1 ("fcntl (F_SETFL): %m"); sigset_t ss; sigfillset (&ss); @@ -76,57 +80,57 @@ sl (void) static void do_prepare (int argc, char *argv[]) { + int semfd; + if (semfile == NULL) + semfd = create_temp_file ("tst-cancel7.", &semfilename); + else + semfd = open (semfile, O_RDWR); + TEST_VERIFY_EXIT (semfd != -1); + + sem = xmmap (NULL, sizeof (sem_t), PROT_READ | PROT_WRITE, MAP_SHARED, + semfd); + TEST_VERIFY_EXIT (sem != SEM_FAILED); + if (semfile == NULL) + { + xftruncate (semfd, sizeof (sem_t)); + TEST_VERIFY_EXIT (sem_init (sem, 1, 0) != -1); + } + if (command == NULL) command = argv[0]; if (pidfile) sl (); - int fd = mkstemp (pidfilename); + int fd = create_temp_file ("tst-cancel7-pid-", &pidfilename); if (fd == -1) - { - puts ("mkstemp failed"); - exit (1); - } + FAIL_EXIT1 ("create_temp_file failed: %m"); - write (fd, " ", 1); - close (fd); + xwrite (fd, " ", 1); + xclose (fd); } static int do_test (void) { - pthread_t th; - if (pthread_create (&th, NULL, tf, NULL) != 0) - { - puts ("pthread_create failed"); - return 1; - } + pthread_t th = xpthread_create (NULL, tf, NULL); do - sleep (1); + nanosleep (&(struct timespec) { .tv_sec = 0, .tv_nsec = 100000000 }, NULL); while (access (pidfilename, R_OK) != 0); xpthread_cancel (th); void *r = xpthread_join (th); - sleep (1); + if (sem_wait (sem) != 0) + FAIL_EXIT1 ("sem_wait: %m"); - FILE *f = fopen (pidfilename, "r+"); - if (f == NULL) - { - puts ("no pidfile"); - return 1; - } + FILE *f = xfopen (pidfilename, "r+"); long long ll; if (fscanf (f, "%lld\n", &ll) != 1) - { - puts ("could not read pid"); - unlink (pidfilename); - return 1; - } + FAIL_EXIT1 ("fscanf: %m"); struct flock fl = { @@ -136,11 +140,7 @@ do_test (void) .l_len = 1 }; if (fcntl (fileno (f), F_GETLK, &fl) != 0) - { - puts ("F_GETLK failed"); - unlink (pidfilename); - return 1; - } + FAIL_EXIT1 ("fcntl: %m"); if (fl.l_type != F_UNLCK) { @@ -148,13 +148,10 @@ do_test (void) if (fl.l_pid == ll) kill (fl.l_pid, SIGKILL); - unlink (pidfilename); return 1; } - fclose (f); - - unlink (pidfilename); + xfclose (f); return r != PTHREAD_CANCELED; } @@ -180,15 +177,15 @@ do_cleanup (void) fclose (f); } - - unlink (pidfilename); } #define OPT_COMMAND 10000 #define OPT_PIDFILE 10001 +#define OPT_SEMFILE 10002 #define CMDLINE_OPTIONS \ { "command", required_argument, NULL, OPT_COMMAND }, \ - { "pidfile", required_argument, NULL, OPT_PIDFILE }, + { "pidfile", required_argument, NULL, OPT_PIDFILE }, \ + { "semaphore", required_argument, NULL, OPT_SEMFILE }, static void cmdline_process (int c) { @@ -200,6 +197,9 @@ cmdline_process (int c) case OPT_PIDFILE: pidfile = optarg; break; + case OPT_SEMFILE: + semfile = optarg; + break; } } #define CMDLINE_PROCESS cmdline_process