From patchwork Wed Nov 14 12:21:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cyril Hrubis X-Patchwork-Id: 997665 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=lists.linux.it (client-ip=213.254.12.146; helo=picard.linux.it; envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.cz Received: from picard.linux.it (picard.linux.it [213.254.12.146]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 42w3Yr5ztKz9s0n for ; Wed, 14 Nov 2018 23:23:25 +1100 (AEDT) Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id C57A33E65EC for ; Wed, 14 Nov 2018 13:23:18 +0100 (CET) X-Original-To: ltp@lists.linux.it Delivered-To: ltp@picard.linux.it Received: from in-2.smtp.seeweb.it (in-2.smtp.seeweb.it [IPv6:2001:4b78:1:20::2]) by picard.linux.it (Postfix) with ESMTP id A27D33E65CC for ; Wed, 14 Nov 2018 13:23:16 +0100 (CET) Received: from mx1.suse.de (mx2.suse.de [195.135.220.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by in-2.smtp.seeweb.it (Postfix) with ESMTPS id 0329F60219F for ; Wed, 14 Nov 2018 13:23:14 +0100 (CET) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 5C285B0DB for ; Wed, 14 Nov 2018 12:23:12 +0000 (UTC) From: Cyril Hrubis To: ltp@lists.linux.it Date: Wed, 14 Nov 2018 13:21:39 +0100 Message-Id: <20181114122139.14690-1-chrubis@suse.cz> X-Mailer: git-send-email 2.16.4 X-Virus-Scanned: clamav-milter 0.99.2 at in-2.smtp.seeweb.it X-Virus-Status: Clean X-Spam-Status: No, score=0.0 required=7.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, SPF_PASS autolearn=disabled version=3.4.0 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on in-2.smtp.seeweb.it Subject: [LTP] [PATCH] [COMMITTED] containers/pidns13: Fix race between threads X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.18 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it Sender: "ltp" The original code was not thread safe and relied on thread ordering to run correctly. The problem is that the thread id was passed as a pointer to a variable that has been changed afterwards, which is obviously not safe. So now the code simply casts integer to pointer and back so we pass the actual value rather than pointer to it, which makes the code simpler and is race free. This has been originaly reported in: https://github.com/linux-test-project/ltp/pull/167 Signed-off-by: Cyril Hrubis --- testcases/kernel/containers/pidns/pidns13.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/testcases/kernel/containers/pidns/pidns13.c b/testcases/kernel/containers/pidns/pidns13.c index e8ab7ce60..003bb61ea 100644 --- a/testcases/kernel/containers/pidns/pidns13.c +++ b/testcases/kernel/containers/pidns/pidns13.c @@ -75,7 +75,7 @@ int child_fn(void *arg) siginfo_t info; struct timespec timeout; pid_t pid, ppid; - int cinit_no = *((int *)arg); + intptr_t cinit_no = (intptr_t)arg; /* Set process id and parent pid */ pid = getpid(); @@ -176,7 +176,6 @@ static void setup(void) int main(int argc, char *argv[]) { int status; - int *cinit_no = malloc(sizeof(int)); pid_t cpid1, cpid2; setup(); @@ -186,18 +185,11 @@ int main(int argc, char *argv[]) tst_resm(TBROK, "parent: pipe creation failed"); } - /* container creation on PID namespace */ - if (!cinit_no) { - tst_resm(TBROK, "memory allocation failed."); - } - /* Create container 1 */ - *cinit_no = 1; - cpid1 = ltp_clone_quick(CLONE_NEWPID | SIGCHLD, child_fn, cinit_no); + cpid1 = ltp_clone_quick(CLONE_NEWPID | SIGCHLD, child_fn, (void*)(intptr_t)1); /* Create container 2 */ - *cinit_no = 2; - cpid2 = ltp_clone_quick(CLONE_NEWPID | SIGCHLD, child_fn, cinit_no); + cpid2 = ltp_clone_quick(CLONE_NEWPID | SIGCHLD, child_fn, (void*)(intptr_t)2); if (cpid1 < 0 || cpid2 < 0) { tst_resm(TBROK, "parent: clone() failed."); }