From patchwork Fri Jun 23 13:49:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joe Simmons-Talbott X-Patchwork-Id: 71590 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 A2CBA385842B for ; Fri, 23 Jun 2023 13:50:24 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A2CBA385842B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1687528224; bh=q7wDQItoKJqCUNLp4SYDzZR6fHIarF0uIitj4Q/3VfI=; h=To:Cc:Subject:Date:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=iogMeabQ/Ypu0gklr8MHkvmny5I4xTV0DKYhIbDAfnvm15lN6k2uGK3+eUL4Ri3i5 lKPw/t77TFSRmXt5edLsynQigZllmccFHoM7kHHnWg3D0V7t5ZnGL/TtqraD3hME2U N64gidNo/vTUGUwnkrpV7SjbJgnkGv8lDxCKhdCY= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 3AC2E3858CD1 for ; Fri, 23 Jun 2023 13:50:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3AC2E3858CD1 Received: from mail-yw1-f197.google.com (mail-yw1-f197.google.com [209.85.128.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-210-cAHGEif6OJSdy1-YecTkww-1; Fri, 23 Jun 2023 09:50:00 -0400 X-MC-Unique: cAHGEif6OJSdy1-YecTkww-1 Received: by mail-yw1-f197.google.com with SMTP id 00721157ae682-565a33c35b1so9815837b3.0 for ; Fri, 23 Jun 2023 06:50:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687528200; x=1690120200; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=q7wDQItoKJqCUNLp4SYDzZR6fHIarF0uIitj4Q/3VfI=; b=fs4uWieDFoyn/4AuKSjwFZFdy0qt/cYRS4yDkxtTae72z2/UYwmOFlU//+uEMw1gCa SQfsbeALLMoJ+b2QG+ui+hZ6xWG9kMO4yu6FPyWI+JOKnHjhg9giBbaSM+4vG153cpTf JB1P9I6f7Nv0zRTxCRDJ6zdDaGqfH8HnBd7yONoeiiI2nbXuPUO0NZxgE7b29zUi3ODe qHRzY9r1X19xAO74V5hj8Elezv1nLQavQCuBriz0jUVeFH075kzJImqaWawSxN5TXyrQ tjSShBLQaFrwCYCHz7qxM6ZJWGczROSgIJtuRBQlFr55qV9O5/hXPE9DzSIT6gVcGkfr eZqw== X-Gm-Message-State: AC+VfDxc+pSkaWAyU6NplLsdCExKFjS00iXzaaUQ+P1Hei1CHXH5RmfI pn5gxeueBn6b79FN8pEO1jYJHTrjugYTcCYm2PSx6svbg1S4EsNyCjeAme9YCKRfzi1pONGZIcZ eglNt7gL28FLGfC3sDR8ApuLKx/9pigiz4jtZn1fom7TJnb04v++hCM59iaJKXhf1CiLWIL8GoQ IXy9K5 X-Received: by 2002:a25:b188:0:b0:be4:684e:1971 with SMTP id h8-20020a25b188000000b00be4684e1971mr20998152ybj.63.1687528199595; Fri, 23 Jun 2023 06:49:59 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5XWV5a8V0aIYRztbdCzKImPYwS4Jj6fdTBQQHE6pVCXsY/sku7brNajeNSO7d4/jGTwUH00w== X-Received: by 2002:a25:b188:0:b0:be4:684e:1971 with SMTP id h8-20020a25b188000000b00be4684e1971mr20998131ybj.63.1687528199134; Fri, 23 Jun 2023 06:49:59 -0700 (PDT) Received: from oak.redhat.com (c-71-206-142-238.hsd1.va.comcast.net. [71.206.142.238]) by smtp.gmail.com with ESMTPSA id 2-20020a250002000000b00be4b8946d9csm2063445yba.35.2023.06.23.06.49.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 23 Jun 2023 06:49:58 -0700 (PDT) To: libc-alpha@sourceware.org Cc: Joe Simmons-Talbott Subject: [PATCH v2] mips: dl-machine-reject-phdr: Get rid of alloca. Date: Fri, 23 Jun 2023 09:49:56 -0400 Message-Id: <20230623134956.1537650-1-josimmon@redhat.com> X-Mailer: git-send-email 2.40.1 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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: Joe Simmons-Talbott via Libc-alpha From: Joe Simmons-Talbott Reply-To: Joe Simmons-Talbott Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Use a scratch_buffer rather than alloca to avoid potential stack overflow. Checked with build-many-glibcs.py on mips-linux-gnu --- Changes to v1: * Use sbuf not buf for scratch_buffer_set_array_size * Move sbuf definition out of conditional block. sysdeps/mips/dl-machine-reject-phdr.h | 80 +++++++++++++++++++++------ 1 file changed, 62 insertions(+), 18 deletions(-) diff --git a/sysdeps/mips/dl-machine-reject-phdr.h b/sysdeps/mips/dl-machine-reject-phdr.h index 104b590661..455ee6efbc 100644 --- a/sysdeps/mips/dl-machine-reject-phdr.h +++ b/sysdeps/mips/dl-machine-reject-phdr.h @@ -20,6 +20,7 @@ #define _DL_MACHINE_REJECT_PHDR_H 1 #include +#include #include #if defined PR_GET_FP_MODE && defined PR_SET_FP_MODE @@ -172,6 +173,8 @@ elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, unsigned int phnum, cur_mode = __prctl (PR_GET_FP_MODE); # endif #endif + struct scratch_buffer sbuf; + scratch_buffer_init (&sbuf); /* Read the attributes section. */ if (ph != NULL) @@ -182,17 +185,29 @@ elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, unsigned int phnum, mips_abiflags = (Elf_MIPS_ABIFlags_v0 *) (buf + ph->p_offset); else { - mips_abiflags = alloca (size); + if (!scratch_buffer_set_array_size (&sbuf, 1, size)) + REJECT (" unable to allocate memory\n"); + mips_abiflags = sbuf.data; + __lseek (fd, ph->p_offset, SEEK_SET); if (__libc_read (fd, (void *) mips_abiflags, size) != size) - REJECT (" unable to read PT_MIPS_ABIFLAGS\n"); + { + scratch_buffer_free (&sbuf); + REJECT (" unable to read PT_MIPS_ABIFLAGS\n"); + } } if (size < sizeof (Elf_MIPS_ABIFlags_v0)) - REJECT (" contains malformed PT_MIPS_ABIFLAGS\n"); + { + scratch_buffer_free (&sbuf); + REJECT (" contains malformed PT_MIPS_ABIFLAGS\n"); + } if (__glibc_unlikely (mips_abiflags->flags2 != 0)) - REJECT (" unknown MIPS.abiflags flags2: %u\n", mips_abiflags->flags2); + { + scratch_buffer_free (&sbuf); + REJECT (" unknown MIPS.abiflags flags2: %u\n", mips_abiflags->flags2); + } in_abi = mips_abiflags->fp_abi; } @@ -202,7 +217,10 @@ elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, unsigned int phnum, /* Unknown ABIs are rejected. */ if (in_abi != -1 && in_abi > Val_GNU_MIPS_ABI_FP_MAX) - REJECT (" uses unknown FP ABI: %u\n", in_abi); + { + scratch_buffer_free (&sbuf); + REJECT (" uses unknown FP ABI: %u\n", in_abi); + } /* Obtain the initial requirements. */ in_req = (in_abi == -1) ? none_req : reqs[in_abi]; @@ -215,7 +233,10 @@ elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, unsigned int phnum, struct abi_req existing_req; if (cached_fpabi_reject_phdr_p (l)) - return true; + { + scratch_buffer_free (&sbuf); + return true; + } #if _MIPS_SIM == _ABIO32 /* A special case arises for O32 FP64 and FP64A where the kernel @@ -229,8 +250,11 @@ elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, unsigned int phnum, if ((l->l_mach.fpabi == Val_GNU_MIPS_ABI_FP_64A || l->l_mach.fpabi == Val_GNU_MIPS_ABI_FP_64) && cur_mode == -1) - REJECT (" found %s running in the wrong mode\n", - fpabi_string (l->l_mach.fpabi)); + { + scratch_buffer_free (&sbuf); + REJECT (" found %s running in the wrong mode\n", + fpabi_string (l->l_mach.fpabi)); + } #endif /* Found a perfect match, success. */ @@ -238,7 +262,10 @@ elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, unsigned int phnum, /* Unknown ABIs are rejected. */ if (l->l_mach.fpabi != -1 && l->l_mach.fpabi > Val_GNU_MIPS_ABI_FP_MAX) - REJECT (" found unknown FP ABI: %u\n", l->l_mach.fpabi); + { + scratch_buffer_free (&sbuf); + REJECT (" found unknown FP ABI: %u\n", l->l_mach.fpabi); + } existing_req = (l->l_mach.fpabi == -1 ? none_req : reqs[l->l_mach.fpabi]); @@ -262,9 +289,12 @@ elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, unsigned int phnum, #endif } else - REJECT (" uses %s, already loaded %s\n", - fpabi_string (in_abi), - fpabi_string (l->l_mach.fpabi)); + { + scratch_buffer_free (&sbuf); + REJECT (" uses %s, already loaded %s\n", + fpabi_string (in_abi), + fpabi_string (l->l_mach.fpabi)); + } } #if _MIPS_SIM == _ABIO32 @@ -281,7 +311,10 @@ elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, unsigned int phnum, If the overall requirements cannot be met by FR0 then reject the object. */ if (cur_mode == -1) - return !in_req.fr0; + { + scratch_buffer_free (&sbuf); + return !in_req.fr0; + } # if HAVE_PRCTL_FP_MODE { @@ -293,9 +326,12 @@ elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, unsigned int phnum, can be either the FR1 mode or FR0 if the requirements are met by FR0. */ if (cannot_mode_switch) - return (!(in_req.fre && cur_mode == (PR_FP_MODE_FR | PR_FP_MODE_FRE)) - && !(in_req.fr1 && cur_mode == PR_FP_MODE_FR) - && !(in_req.fr0 && cur_mode == 0)); + { + scratch_buffer_free (&sbuf); + return (!(in_req.fre && cur_mode == (PR_FP_MODE_FR | PR_FP_MODE_FRE)) + && !(in_req.fr1 && cur_mode == PR_FP_MODE_FR) + && !(in_req.fr0 && cur_mode == 0)); + } /* If the overall requirements can be satisfied by FRE but not FR1 then fr1_mode must become FRE. */ @@ -305,14 +341,21 @@ elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, unsigned int phnum, /* Set the new mode. Use fr1_mode if the requirements cannot be met by FR0. */ if (!in_req.fr0) - return __prctl (PR_SET_FP_MODE, fr1_mode) != 0; + { + scratch_buffer_free (&sbuf); + return __prctl (PR_SET_FP_MODE, fr1_mode) != 0; + } else if (__prctl (PR_SET_FP_MODE, /* fr0_mode */ 0) != 0) { /* Setting FR0 can validly fail on an R6 core so retry with the FR1 mode as a fall back. */ if (errno != ENOTSUP) - return true; + { + scratch_buffer_free (&sbuf); + return true; + } + scratch_buffer_free (&sbuf); return __prctl (PR_SET_FP_MODE, fr1_mode) != 0; } } @@ -320,6 +363,7 @@ elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, unsigned int phnum, } #endif /* _MIPS_SIM == _ABIO32 */ + scratch_buffer_free (&sbuf); return false; }