From patchwork Sun Feb 9 19:27:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Samuel Thibault X-Patchwork-Id: 1235537 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-109301-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=ens-lyon.org Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha1 header.s=default header.b=dnESaW1P; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48FzbW5nbqz9sRQ for ; Mon, 10 Feb 2020 06:28:23 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id :mime-version:content-transfer-encoding; q=dns; s=default; b=eil pc5RftGXOxBbwLGj9shmrYu1yOZwZI4XJa3+mLln83aeahvUe8M0sj+7Pr45qtPm oNoEhmoaBWCyzrPOpbcht0yXKNU+DcR/vr+tL43nC1upD5z+tHdUKD9JS/CrzuTZ M55ZVfz/jdS0B359fxBECAnOSAB3eM9C4ESVgvEI= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id :mime-version:content-transfer-encoding; s=default; bh=rdFHcdQsL xAodUonuvBlZP9y4/E=; b=dnESaW1PZbeg3/uw2+mF1YGP7/byCD7jMd4qL0NDu di1KC+1OU1Ch8i0IkAQWx10w7QZH3Dvd335v2nP/LtjassUSFl/yU3bMsKeOQOZf SboOHLVfgZrEE9yghIxNu6JSi3sPSIE0sncOdJiESF9RQ/Ep9OSZQlogIgGadn5t Gs= Received: (qmail 27525 invoked by alias); 9 Feb 2020 19:27:59 -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 27425 invoked by uid 89); 9 Feb 2020 19:27:58 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.2 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_NEUTRAL autolearn=ham version=3.3.1 spammy= X-HELO: hera.aquilenet.fr From: Samuel Thibault To: libc-alpha@sourceware.org Cc: Samuel Thibault , commit-hurd@gnu.org Subject: [hurd, commited 1/3] htl: Report missing mutex lock on pthread_cond_*wait Date: Sun, 9 Feb 2020 20:27:48 +0100 Message-Id: <20200209192750.292859-1-samuel.thibault@ens-lyon.org> MIME-Version: 1.0 --- htl/Makefile | 2 +- htl/pt-internal.h | 3 ++ sysdeps/htl/pt-cond-timedwait.c | 4 ++ sysdeps/mach/hurd/htl/pt-mutex-checklocked.c | 51 ++++++++++++++++++++ 4 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 sysdeps/mach/hurd/htl/pt-mutex-checklocked.c diff --git a/htl/Makefile b/htl/Makefile index bb9ef5deba..b2dc797ee4 100644 --- a/htl/Makefile +++ b/htl/Makefile @@ -68,7 +68,7 @@ libpthread-routines := pt-attr pt-attr-destroy pt-attr-getdetachstate \ pt-mutexattr-setpshared pt-mutexattr-settype \ pt-mutexattr-getrobust pt-mutexattr-setrobust \ \ - pt-mutex-init pt-mutex-destroy \ + pt-mutex-init pt-mutex-destroy pt-mutex-checklocked \ pt-mutex-lock pt-mutex-trylock pt-mutex-timedlock \ pt-mutex-unlock \ pt-mutex-transfer-np \ diff --git a/htl/pt-internal.h b/htl/pt-internal.h index 064e795157..8ffe1bd970 100644 --- a/htl/pt-internal.h +++ b/htl/pt-internal.h @@ -301,6 +301,9 @@ extern error_t __pthread_sigstate (struct __pthread *__restrict thread, int how, const sigset_t *__restrict set, sigset_t *__restrict oset, int clear_pending); + +/* If supported, check that MUTEX is locked by the caller. */ +extern int __pthread_mutex_checklocked (pthread_mutex_t *mtx); /* Default thread attributes. */ diff --git a/sysdeps/htl/pt-cond-timedwait.c b/sysdeps/htl/pt-cond-timedwait.c index d9ce23b682..3a11e016d7 100644 --- a/sysdeps/htl/pt-cond-timedwait.c +++ b/sysdeps/htl/pt-cond-timedwait.c @@ -78,6 +78,10 @@ __pthread_cond_timedwait_internal (pthread_cond_t *cond, if (abstime && ! valid_nanoseconds (abstime->tv_nsec)) return EINVAL; + err = __pthread_mutex_checklocked (mutex); + if (err) + return err; + struct __pthread *self = _pthread_self (); struct cancel_ctx ctx; ctx.wakeup = self; diff --git a/sysdeps/mach/hurd/htl/pt-mutex-checklocked.c b/sysdeps/mach/hurd/htl/pt-mutex-checklocked.c new file mode 100644 index 0000000000..dea580fa04 --- /dev/null +++ b/sysdeps/mach/hurd/htl/pt-mutex-checklocked.c @@ -0,0 +1,51 @@ +/* __pthread_mutex_checklocked. Hurd version. + Copyright (C) 2016-2020 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include "pt-mutex.h" +#include + +int +__pthread_mutex_checklocked (pthread_mutex_t *mtxp) +{ + int ret = 0; + + switch (MTX_TYPE (mtxp)) + { + case PT_MTX_NORMAL: + break; + + case PT_MTX_RECURSIVE: + case PT_MTX_ERRORCHECK: + case PT_MTX_NORMAL | PTHREAD_MUTEX_ROBUST: + case PT_MTX_RECURSIVE | PTHREAD_MUTEX_ROBUST: + case PT_MTX_ERRORCHECK | PTHREAD_MUTEX_ROBUST: + if (!mtx_owned_p (mtxp, _pthread_self (), mtxp->__flags)) + ret = EPERM; + break; + + default: + ret = EINVAL; + break; + } + + return ret; +}