From patchwork Thu Aug 31 12:49:33 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: 75064 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 487333858438 for ; Thu, 31 Aug 2023 12:50:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 487333858438 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1693486223; bh=f7tksfD4cgmqko1WFOtY1wv5KanzIPO7ytOpKJ5lY2w=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=cb94RsiEW0YAv1IW/BLxRF+hw2rb9s8fvvvIas379L66y1np3EONRFMpcgaNJV40K 0xmihHKdOKXcmi+JW19pBCnvk8Q8DRT2MApQqUjFfLN5FB6J00OgcwiniWQCswmRTp neVEHfVzMJdhDeuaQAiu7T3/WS9n4kN4qhWMKMbM= 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 A2A7C385E019 for ; Thu, 31 Aug 2023 12:49:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A2A7C385E019 Received: from mail-qk1-f198.google.com (mail-qk1-f198.google.com [209.85.222.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-652-RjiTB14iMjmXE4To50XgZg-1; Thu, 31 Aug 2023 08:49:57 -0400 X-MC-Unique: RjiTB14iMjmXE4To50XgZg-1 Received: by mail-qk1-f198.google.com with SMTP id af79cd13be357-76f03d9864cso90746985a.3 for ; Thu, 31 Aug 2023 05:49:57 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693486196; x=1694090996; 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=f7tksfD4cgmqko1WFOtY1wv5KanzIPO7ytOpKJ5lY2w=; b=Vwbmdh2kA1xDF7searwyZrAxuoOJ04SB27ASmndrhxPTJsKOwbj2jiVG7lgzc68y76 6oQVLSbXzIkGrTPmUZIIJPfXsY1yzgaPWT/txfUiKem2HfyBouA/VzCMKFA5g519zONB xoB0gKocbd1odldbUSQ90oy9/Sd62a9dZLazzUpXDut3QsCPS2/g7r2n/mp07nlFaYY4 gyrZu1WIX+hjx4sU0usEyfaXEDQCh6H53TLignv0bjMPtvTtu/loBogq8aOBlKo/o4LY PLhHFsjo6pmSZSp91B0ZE74kRUi8WzIlj51lvHcNVWIrTUXaYavkKIuTCrdggKBlUjqI XYNA== X-Gm-Message-State: AOJu0YzttEvEqWAc80Eyw7tirWO2IsWB4qwk/lLzE36H8pKOqDUJGkMZ 7j4q8QYq+ku2f9wlxA46GL/Bk5HccEddQPKohy0AdxpZTnB6Ezl/yfCSlpPJ9YiulHNRzeLWiXP fy+ZPL0GSgh5FXIMqWnnAQyMIgU6GA3ERIs+yTr78e51oGBOku/iJJQdxNgwoWFBE7XTi4qFIxi 6nAezV X-Received: by 2002:a05:620a:24c3:b0:76c:bc55:1a5 with SMTP id m3-20020a05620a24c300b0076cbc5501a5mr2806747qkn.50.1693486196321; Thu, 31 Aug 2023 05:49:56 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGonuY95B/U3kH8mvFH3cKMsMbcLup+ibQ+vP6V8GfaDBb/a8MrFHDpzqXMgWKgbwXVowJxsQ== X-Received: by 2002:a05:620a:24c3:b0:76c:bc55:1a5 with SMTP id m3-20020a05620a24c300b0076cbc5501a5mr2806729qkn.50.1693486195893; Thu, 31 Aug 2023 05:49:55 -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 k12-20020a05620a142c00b0076e672f535asm564326qkj.57.2023.08.31.05.49.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Aug 2023 05:49:55 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH] libc_fatal: Get rid of alloca Date: Thu, 31 Aug 2023 08:49:33 -0400 Message-ID: <20230831124953.2090492-1-josimmon@redhat.com> X-Mailer: git-send-email 2.41.0 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-12.6 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_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP 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.30 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 scratch_buffers in place of alloca to avoid potential stack overflow. --- NOTE: I'm not certain that this is the best way to handle allocation failures by jumping straight to the abort and am open to other suggestions. sysdeps/posix/libc_fatal.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/sysdeps/posix/libc_fatal.c b/sysdeps/posix/libc_fatal.c index 70edcc10c1..f8e2df4157 100644 --- a/sysdeps/posix/libc_fatal.c +++ b/sysdeps/posix/libc_fatal.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -58,6 +59,10 @@ __libc_message (const char *fmt, ...) { va_list ap; int fd = -1; + struct scratch_buffer sbuf; + scratch_buffer_init (&sbuf); + int newp_idx = 0; + struct str_list *_newp = sbuf.data; va_start (ap, fmt); @@ -70,6 +75,8 @@ __libc_message (const char *fmt, ...) struct str_list *list = NULL; int nlist = 0; + struct scratch_buffer iovec_buf; + scratch_buffer_init (&iovec_buf); const char *cp = fmt; while (*cp != '\0') @@ -100,17 +107,30 @@ __libc_message (const char *fmt, ...) cp = next; } - struct str_list *newp = alloca (sizeof (struct str_list)); + struct str_list *newp = _newp + newp_idx; + if ((void *) newp > sbuf.data + sbuf.length) + { + if (!scratch_buffer_grow_preserve (&sbuf)) + goto fail_out; + _newp = sbuf.data; + newp = _newp + newp_idx; + } newp->str = str; newp->len = len; newp->next = list; list = newp; ++nlist; + ++newp_idx; } if (nlist > 0) { - struct iovec *iov = alloca (nlist * sizeof (struct iovec)); + if (!scratch_buffer_set_array_size (&iovec_buf, + nlist, sizeof (struct iovec))) + goto fail_out; + + struct iovec *iov = iovec_buf.data; + ssize_t total = 0; for (int cnt = nlist - 1; cnt >= 0; --cnt) @@ -146,6 +166,9 @@ __libc_message (const char *fmt, ...) va_end (ap); +fail_out: + scratch_buffer_free (&sbuf); + scratch_buffer_free (&iovec_buf); /* Kill the application. */ abort (); }