From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oi1-x22b.google.com (mail-oi1-x22b.google.com [IPv6:2607:f8b0:4864:20::22b]) by sourceware.org (Postfix) with ESMTPS id B6537382D3C7 for ; Thu, 15 Dec 2022 18:16:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org B6537382D3C7 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linaro.org Received: by mail-oi1-x22b.google.com with SMTP id q186so5988200oia.9 for ; Thu, 15 Dec 2022 10:16:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:in-reply-to:organization:from:references :to:content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=8EhrhRGJa4WwBRXzNblzMBL2N4ylp7qe5kVp6okij74=; b=vyOfTUscILv+fTMw4myMgq7UhOydSGQ3fK/7Z/mKVvjStdoZOwTqMUjBTiOGDq7+St P5IUJ0/xfHzvImQhG5UPnYg+vgDdsJeCeBiuEML+rP5D1yWPscnitbuZAwmxu+XZfxzp Vn7nKdV5WmqNWxKWbkpq3wnghKGNjH9QLsMYjkFQkE0fLAvmkvGzpAqtMB00cyDxpNrM bgV2WXzNGRBcQ2KhFUaEfXrL3mpaHz5hEOKssyoh69OmxcCqqbXXns8q4lq80gAW15a7 zHlfI1PGxWmNHXtlCWdoQCCllQuTZT6fEHXo0LwX7nUpmwpT3ybOVMnVkosGxRs/hZWW 9Pkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:in-reply-to:organization:from:references :to:content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=8EhrhRGJa4WwBRXzNblzMBL2N4ylp7qe5kVp6okij74=; b=23AanYbkDjz5vAY12IG49OUb9+xnkaO4PP9wqf36OWdWux2sOz/jmoV1/ykbn85iQc cxdw0pNH77vLIXrgVX4IuWhJYpoF+SfmJ+xT/0IE7G5S4a8gOQ3Lf5KZMLTgMgo9Yz2v AP7tcXrhDIBC7Xu5i1ewMtWd5FDu5itu9hJQACiHUPAkbSf+kCQvfBRQor1oUGliizGy SfD7JcWVKpFwKbjyDkhCng2tDM7P52UKTX6VlN2Wd4dC+/wmedvmwOHwaGLVDcR1sgPG R832j52pJPL6IeDnqbKavp31jJTogccngGnL2qbASZ+JLqvntnWdSrRFXmKkhh6OFoBL OcCw== X-Gm-Message-State: ANoB5pnvqIxLnZrXcSud0vhxVZNooVHtdyTYTlL0tc7rDzihKSZ5uJ7G p0bf/l3cljHCDd9b9eVtFGJYgA6rAlUMGn966rM= X-Google-Smtp-Source: AA0mqf5jz0B/gbsWKKeE01aIFG6jJh1J/9eM9ikwOfEdw4atkjwns+jVwVsA9Fh/2Vo33XBSvUybuQ== X-Received: by 2002:aca:ac8b:0:b0:35e:2d60:32d9 with SMTP id v133-20020acaac8b000000b0035e2d6032d9mr12511595oie.27.1671128209252; Thu, 15 Dec 2022 10:16:49 -0800 (PST) Received: from ?IPV6:2804:1b3:a7c2:f05e:14ba:6503:a761:d926? ([2804:1b3:a7c2:f05e:14ba:6503:a761:d926]) by smtp.gmail.com with ESMTPSA id a28-20020a056808099c00b0035ba52d0efasm1292771oic.52.2022.12.15.10.16.47 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 15 Dec 2022 10:16:48 -0800 (PST) Message-ID: Date: Thu, 15 Dec 2022 15:16:46 -0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.5.1 Subject: Re: [PATCH v5 07/11] libio: Convert __vsprintf_internal to buffers Content-Language: en-US To: libc-alpha@sourceware.org, Florian Weimer References: From: Adhemerval Zanella Netto Organization: Linaro In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-12.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,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 List-Id: LGTM, with a small fix below. Reviewed-by: Adhemerval Zanella On 12/12/22 12:23, Florian Weimer via Libc-alpha wrote: > --- > include/printf_buffer.h | 2 + > libio/iovsprintf.c | 70 ++++++++---------------------- > stdio-common/printf_buffer_flush.c | 4 ++ > 3 files changed, 24 insertions(+), 52 deletions(-) > > diff --git a/include/printf_buffer.h b/include/printf_buffer.h > index e89f984aca..92393399fb 100644 > --- a/include/printf_buffer.h > +++ b/include/printf_buffer.h > @@ -44,7 +44,9 @@ > enum __printf_buffer_mode > { > __printf_buffer_mode_failed, > + __printf_buffer_mode_sprintf, > __printf_buffer_mode_snprintf, > + __printf_buffer_mode_sprintf_chk, > __printf_buffer_mode_to_file, > __printf_buffer_mode_strfmon, > __printf_buffer_mode_fp, /* For __printf_fp_l_buffer. */ > diff --git a/libio/iovsprintf.c b/libio/iovsprintf.c > index 72c67bf27b..7305d8e247 100644 > --- a/libio/iovsprintf.c > +++ b/libio/iovsprintf.c > @@ -25,58 +25,18 @@ > in files containing the exception. */ > > #include "libioP.h" > -#include "strfile.h" > > -static int __THROW > -_IO_str_chk_overflow (FILE *fp, int c) > -{ > - /* If we get here, the user-supplied buffer would be overrun by > - further output. */ > - __chk_fail (); > -} > - > -static const struct _IO_jump_t _IO_str_chk_jumps libio_vtable = Remove the _IO_str_chk_jumps entry from tst-relro-libc.out check. > -{ > - JUMP_INIT_DUMMY, > - JUMP_INIT(finish, _IO_str_finish), > - JUMP_INIT(overflow, _IO_str_chk_overflow), > - JUMP_INIT(underflow, _IO_str_underflow), > - JUMP_INIT(uflow, _IO_default_uflow), > - JUMP_INIT(pbackfail, _IO_str_pbackfail), > - JUMP_INIT(xsputn, _IO_default_xsputn), > - JUMP_INIT(xsgetn, _IO_default_xsgetn), > - JUMP_INIT(seekoff, _IO_str_seekoff), > - JUMP_INIT(seekpos, _IO_default_seekpos), > - JUMP_INIT(setbuf, _IO_default_setbuf), > - JUMP_INIT(sync, _IO_default_sync), > - JUMP_INIT(doallocate, _IO_default_doallocate), > - JUMP_INIT(read, _IO_default_read), > - JUMP_INIT(write, _IO_default_write), > - JUMP_INIT(seek, _IO_default_seek), > - JUMP_INIT(close, _IO_default_close), > - JUMP_INIT(stat, _IO_default_stat), > - JUMP_INIT(showmanyc, _IO_default_showmanyc), > - JUMP_INIT(imbue, _IO_default_imbue) > -}; > - > -/* This function is called by regular vsprintf with maxlen set to -1, > - and by vsprintf_chk with maxlen set to the size of the output > - string. In the former case, _IO_str_chk_overflow will never be > - called; in the latter case it will crash the program if the buffer > - overflows. */ > +#include > +#include > +#include > > int > __vsprintf_internal (char *string, size_t maxlen, > const char *format, va_list args, > unsigned int mode_flags) > { > - _IO_strfile sf; > - int ret; > + struct __printf_buffer buf; > > -#ifdef _IO_MTSAFE_IO > - sf._sbf._f._lock = NULL; > -#endif > - _IO_no_init (&sf._sbf._f, _IO_USER_LOCK, -1, NULL, NULL); > /* When called from fortified sprintf/vsprintf, erase the destination > buffer and try to detect overflows. When called from regular > sprintf/vsprintf, do not erase the destination buffer, because > @@ -84,19 +44,25 @@ __vsprintf_internal (char *string, size_t maxlen, > by ISO C), nor try to detect overflows. */ > if ((mode_flags & PRINTF_CHK) != 0) > { > - _IO_JUMPS (&sf._sbf) = &_IO_str_chk_jumps; > string[0] = '\0'; > + __printf_buffer_init (&buf, string, maxlen, > + __printf_buffer_mode_sprintf_chk); > } > else > - _IO_JUMPS (&sf._sbf) = &_IO_str_jumps; > - _IO_str_init_static_internal (&sf, string, > - (maxlen == -1) ? -1 : maxlen - 1, > - string); > + { > + __printf_buffer_init (&buf, string, 0, __printf_buffer_mode_sprintf); > + buf.write_end = (char *) ~(uintptr_t) 0; /* End of address space. */ > + } > + > + __printf_buffer (&buf, format, args, mode_flags); > > - ret = __vfprintf_internal (&sf._sbf._f, format, args, mode_flags); > + /* Write the NUL terminator if there is room. Do not use the putc > + operation to avoid overflowing the character write count. */ > + if ((mode_flags & PRINTF_CHK) != 0 && buf.write_ptr == buf.write_end) > + __chk_fail (); > + *buf.write_ptr = '\0'; > > - *sf._sbf._f._IO_write_ptr = '\0'; > - return ret; > + return __printf_buffer_done (&buf); > } > > int Ok. > diff --git a/stdio-common/printf_buffer_flush.c b/stdio-common/printf_buffer_flush.c > index bfd1f9d733..f44c8b887f 100644 > --- a/stdio-common/printf_buffer_flush.c > +++ b/stdio-common/printf_buffer_flush.c > @@ -38,10 +38,14 @@ __printf_buffer_do_flush (struct __printf_buffer *buf) > switch (buf->mode) > { > case __printf_buffer_mode_failed: > + case __printf_buffer_mode_sprintf: > return; > case __printf_buffer_mode_snprintf: > __printf_buffer_flush_snprintf ((struct __printf_buffer_snprintf *) buf); > return; > + case __printf_buffer_mode_sprintf_chk: > + __chk_fail (); > + break; > case __printf_buffer_mode_to_file: > __printf_buffer_flush_to_file ((struct __printf_buffer_to_file *) buf); > return; Ok.