From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-out.m-online.net (mail-out.m-online.net [212.18.0.9]) by sourceware.org (Postfix) with ESMTPS id 888B63851C2D for ; Thu, 14 May 2020 07:13:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 888B63851C2D Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux-m68k.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=whitebox@nefkom.net Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 49N2n82zHxz1qskW; Thu, 14 May 2020 09:13:00 +0200 (CEST) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 49N2n82YBzz1shdr; Thu, 14 May 2020 09:13:00 +0200 (CEST) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id Hks4-8erS64c; Thu, 14 May 2020 09:12:59 +0200 (CEST) X-Auth-Info: +wJqfBbJ4VP3PSmuKS0jFbAzizwKyq6ktGa/ZmYi+F0DHVlyTCLoAEbPLNCBkg6w Received: from igel.home (ppp-46-244-180-168.dynamic.mnet-online.de [46.244.180.168]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPSA; Thu, 14 May 2020 09:12:59 +0200 (CEST) Received: by igel.home (Postfix, from userid 1000) id D696F2C1E36; Thu, 14 May 2020 09:12:58 +0200 (CEST) From: Andreas Schwab To: Adhemerval Zanella via Libc-alpha Subject: Re: [RFC 3/4] string: Make strerror async-signal-safe References: <20200513202630.2123238-1-adhemerval.zanella@linaro.org> <20200513202630.2123238-4-adhemerval.zanella@linaro.org> X-Yow: I'd like MY data-base JULIENNED and stir-fried! Date: Thu, 14 May 2020 09:12:58 +0200 In-Reply-To: <20200513202630.2123238-4-adhemerval.zanella@linaro.org> (Adhemerval Zanella via Libc-alpha's message of "Wed, 13 May 2020 17:26:29 -0300") Message-ID: <87mu6b56rp.fsf@igel.home> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.91 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Status: No, score=-3.6 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, 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: , X-List-Received-Date: Thu, 14 May 2020 07:13:03 -0000 On Mai 13 2020, Adhemerval Zanella via Libc-alpha wrote: > +char * > +__strerror_lookup (int errnum) > +{ > + if (__glibc_unlikely (errnum < 0 || errnum >= _sys_nerr_internal)) > + return NULL; > + return (char *) _sys_errlist_internal[errnum]; > +} > > /* Return a string describing the errno code in ERRNUM. */ > char * > __strerror_r (int errnum, char *buf, size_t buflen) > { > - if (__glibc_unlikely (errnum < 0 || errnum >= _sys_nerr_internal > - || _sys_errlist_internal[errnum] == NULL)) > - { > - /* Buffer we use to print the number in. For a maximum size for > - `int' of 8 bytes we never need more than 20 digits. */ > - char numbuf[21]; > - const char *unk = _("Unknown error "); > - size_t unklen = strlen (unk); > - char *p, *q; > - bool negative = errnum < 0; > + char *r = __strerror_lookup (errnum); > + if (r != NULL) > + return r; > > - numbuf[20] = '\0'; > - p = _itoa_word (abs (errnum), &numbuf[20], 10, 0); > + const size_t unklen = array_length (UNK_ERR_STR) - 1; > + char *q = __mempcpy (buf, UNK_ERR_STR, MIN (buflen, unklen)); > + if (unklen < buflen) > + { > + char numstr[INT_STRLEN_BOUND (int) + 1]; > + size_t numstrlen = 1; > > - /* Now construct the result while taking care for the destination > - buffer size. */ > - q = __mempcpy (buf, unk, MIN (unklen, buflen)); > - if (negative && unklen < buflen) > + char *p = numstr; > + long int errn = errnum; Why long int? Andreas. -- Andreas Schwab, schwab@linux-m68k.org GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510 2552 DF73 E780 A9DA AEC1 "And now for something completely different."