From patchwork Wed Dec 30 11:41:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiaoming Ni X-Patchwork-Id: 1421341 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=8.43.85.97; helo=sourceware.org; envelope-from=libc-alpha-bounces@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=huawei.com Received: from sourceware.org (unknown [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4D5TsP3Jv9z9sVm for ; Wed, 30 Dec 2020 22:42:01 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 85A4238350B9; Wed, 30 Dec 2020 11:41:55 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from szxga04-in.huawei.com (szxga04-in.huawei.com [45.249.212.190]) by sourceware.org (Postfix) with ESMTPS id 549043835099 for ; Wed, 30 Dec 2020 11:41:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 549043835099 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=huawei.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=nixiaoming@huawei.com Received: from DGGEMS408-HUB.china.huawei.com (unknown [172.30.72.58]) by szxga04-in.huawei.com (SkyGuard) with ESMTP id 4D5Tqv4hGMzkxGY; Wed, 30 Dec 2020 19:40:43 +0800 (CST) Received: from use12-sp2.huawei.com (10.67.189.174) by DGGEMS408-HUB.china.huawei.com (10.3.19.208) with Microsoft SMTP Server id 14.3.498.0; Wed, 30 Dec 2020 19:41:35 +0800 From: Xiaoming Ni To: , , , , Subject: [PATCH] setrlimit/getrlimit: Add parameter check to prevent null pointer access Date: Wed, 30 Dec 2020 19:41:31 +0800 Message-ID: <20201230114131.47589-1-nixiaoming@huawei.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 X-Originating-IP: [10.67.189.174] X-CFilter-Loop: Reflected X-Spam-Status: No, score=-13.0 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, 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: , Cc: wangle6@huawei.com, nixiaoming@huawei.com Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" Following sysdeps/mach/hurd/[gs]etrlimit.c. Add parameter check to prevent null pointer access in setrlimit(). Using Macro Functions RETURN_IF_RLIMIT_EINVAL() to Avoid Duplicate Code Copy. --- resource/getrlimit64.c | 2 ++ resource/setrlimit64.c | 2 ++ resource/sys/resource.h | 8 ++++++++ sysdeps/mach/hurd/getrlimit.c | 6 +----- sysdeps/mach/hurd/setrlimit.c | 6 +----- sysdeps/unix/sysv/linux/alpha/getrlimit64.c | 2 ++ sysdeps/unix/sysv/linux/alpha/setrlimit64.c | 2 ++ sysdeps/unix/sysv/linux/getrlimit64.c | 2 ++ sysdeps/unix/sysv/linux/mips/getrlimit64.c | 2 ++ sysdeps/unix/sysv/linux/mips/setrlimit64.c | 2 ++ sysdeps/unix/sysv/linux/setrlimit.c | 2 ++ 11 files changed, 26 insertions(+), 10 deletions(-) diff --git a/resource/getrlimit64.c b/resource/getrlimit64.c index 41b6fa01d2..84059a5db8 100644 --- a/resource/getrlimit64.c +++ b/resource/getrlimit64.c @@ -26,6 +26,8 @@ __getrlimit64 (enum __rlimit_resource resource, struct rlimit64 *rlimits) { struct rlimit rlimits32; + RETURN_IF_RLIMIT_EINVAL(resource, rlimits); + if (__getrlimit (resource, &rlimits32) < 0) return -1; diff --git a/resource/setrlimit64.c b/resource/setrlimit64.c index 0411e3ea19..687df56cb3 100644 --- a/resource/setrlimit64.c +++ b/resource/setrlimit64.c @@ -27,6 +27,8 @@ setrlimit64 (enum __rlimit_resource resource, const struct rlimit64 *rlimits) { struct rlimit rlimits32; + RETURN_IF_RLIMIT_EINVAL(resource, rlimits); + if (rlimits->rlim_cur >= RLIM_INFINITY) rlimits32.rlim_cur = RLIM_INFINITY; else diff --git a/resource/sys/resource.h b/resource/sys/resource.h index 4edafb50d5..a98b7c8b4e 100644 --- a/resource/sys/resource.h +++ b/resource/sys/resource.h @@ -82,6 +82,14 @@ extern int setrlimit64 (__rlimit_resource_t __resource, const struct rlimit64 *__rlimits) __THROW; #endif +#define RETURN_IF_RLIMIT_EINVAL(resource, rlimits) do { \ + if ((rlimits) == NULL || (unsigned int) (resource) >= RLIMIT_NLIMITS) \ + { \ + errno = EINVAL; \ + return -1; \ + } \ +} while(0) + /* Return resource usage information on process indicated by WHO and put it in *USAGE. Returns 0 for success, -1 for failure. */ extern int getrusage (__rusage_who_t __who, struct rusage *__usage) __THROW; diff --git a/sysdeps/mach/hurd/getrlimit.c b/sysdeps/mach/hurd/getrlimit.c index 32d37c185d..904a9b7b9b 100644 --- a/sysdeps/mach/hurd/getrlimit.c +++ b/sysdeps/mach/hurd/getrlimit.c @@ -27,11 +27,7 @@ __getrlimit (enum __rlimit_resource resource, struct rlimit *rlimits) { struct rlimit lim; - if (rlimits == NULL || (unsigned int) resource >= RLIMIT_NLIMITS) - { - errno = EINVAL; - return -1; - } + RETURN_IF_RLIMIT_EINVAL(resource, rlimits); HURD_CRITICAL_BEGIN; __mutex_lock (&_hurd_rlimit_lock); diff --git a/sysdeps/mach/hurd/setrlimit.c b/sysdeps/mach/hurd/setrlimit.c index e0f80bbb9c..a1b5615b93 100644 --- a/sysdeps/mach/hurd/setrlimit.c +++ b/sysdeps/mach/hurd/setrlimit.c @@ -29,11 +29,7 @@ __setrlimit (enum __rlimit_resource resource, const struct rlimit *rlimits) { struct rlimit lim; - if (rlimits == NULL || (unsigned int) resource >= RLIMIT_NLIMITS) - { - errno = EINVAL; - return -1; - } + RETURN_IF_RLIMIT_EINVAL(resource, rlimits); lim = *rlimits; diff --git a/sysdeps/unix/sysv/linux/alpha/getrlimit64.c b/sysdeps/unix/sysv/linux/alpha/getrlimit64.c index 96655ff77e..017a7c18d4 100644 --- a/sysdeps/unix/sysv/linux/alpha/getrlimit64.c +++ b/sysdeps/unix/sysv/linux/alpha/getrlimit64.c @@ -35,6 +35,8 @@ __old_getrlimit64 (enum __rlimit_resource resource, { struct rlimit64 krlimits; + RETURN_IF_RLIMIT_EINVAL(resource, rlimits); + if (__getrlimit64 (resource, &krlimits) < 0) return -1; diff --git a/sysdeps/unix/sysv/linux/alpha/setrlimit64.c b/sysdeps/unix/sysv/linux/alpha/setrlimit64.c index ae77b4127c..8c5ac6c76e 100644 --- a/sysdeps/unix/sysv/linux/alpha/setrlimit64.c +++ b/sysdeps/unix/sysv/linux/alpha/setrlimit64.c @@ -35,6 +35,8 @@ __old_setrlimit64 (enum __rlimit_resource resource, { struct rlimit64 krlimits; + RETURN_IF_RLIMIT_EINVAL(resource, rlimits); + if (rlimits->rlim_cur == OLD_RLIM64_INFINITY) krlimits.rlim_cur = RLIM64_INFINITY; else diff --git a/sysdeps/unix/sysv/linux/getrlimit64.c b/sysdeps/unix/sysv/linux/getrlimit64.c index e06ffd1a16..e75d06a402 100644 --- a/sysdeps/unix/sysv/linux/getrlimit64.c +++ b/sysdeps/unix/sysv/linux/getrlimit64.c @@ -66,6 +66,8 @@ __old_getrlimit64 (enum __rlimit_resource resource, struct rlimit64 *rlimits) { struct rlimit rlimits32; + RETURN_IF_RLIMIT_EINVAL(resource, rlimits); + if (__new_getrlimit (resource, &rlimits32) < 0) return -1; diff --git a/sysdeps/unix/sysv/linux/mips/getrlimit64.c b/sysdeps/unix/sysv/linux/mips/getrlimit64.c index f42100f085..94008444a9 100644 --- a/sysdeps/unix/sysv/linux/mips/getrlimit64.c +++ b/sysdeps/unix/sysv/linux/mips/getrlimit64.c @@ -45,6 +45,8 @@ __old_getrlimit64 (enum __rlimit_resource resource, { struct rlimit64 krlimits; + RETURN_IF_RLIMIT_EINVAL(resource, rlimits); + if (__getrlimit64 (resource, &krlimits) < 0) return -1; diff --git a/sysdeps/unix/sysv/linux/mips/setrlimit64.c b/sysdeps/unix/sysv/linux/mips/setrlimit64.c index 36f5d85378..10ae33bf37 100644 --- a/sysdeps/unix/sysv/linux/mips/setrlimit64.c +++ b/sysdeps/unix/sysv/linux/mips/setrlimit64.c @@ -44,6 +44,8 @@ __old_setrlimit64 (enum __rlimit_resource resource, { struct rlimit64 krlimits; + RETURN_IF_RLIMIT_EINVAL(resource, rlimits); + if (rlimits->rlim_cur == OLD_RLIM64_INFINITY) krlimits.rlim_cur = RLIM64_INFINITY; else diff --git a/sysdeps/unix/sysv/linux/setrlimit.c b/sysdeps/unix/sysv/linux/setrlimit.c index 6648fad5c0..98659c4ced 100644 --- a/sysdeps/unix/sysv/linux/setrlimit.c +++ b/sysdeps/unix/sysv/linux/setrlimit.c @@ -35,6 +35,8 @@ __setrlimit (enum __rlimit_resource resource, const struct rlimit *rlim) { struct rlimit64 rlim64; + RETURN_IF_RLIMIT_EINVAL(resource, rlim); + if (rlim->rlim_cur == RLIM_INFINITY) rlim64.rlim_cur = RLIM64_INFINITY; else