From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 3E6843858D33 for ; Tue, 31 Jan 2023 21:07:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3E6843858D33 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1675199250; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bmwLjQssg8Wov3RNm1Mm2QpTRLDsTn/ZDtOGWTFeDbM=; b=bOdTgsD3yly63rMGtW8F8bJxKHqhAV9iwkiJpREhJF1brLnXo5PQq0GzOJupzYJTt/5kze WdZ4YmIx+tjqt0yl4Xzph9t5YdRwZEgUP3pMhaQALtH3rfSWTjDB/pzjGMZluZb6MCzgKE Sh8Lb3vrpcCt0wJT6wEdm5D9lbDLjfs= Received: from mail-il1-f198.google.com (mail-il1-f198.google.com [209.85.166.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-627-NO2oNo4cMVqtyQr1px_y-A-1; Tue, 31 Jan 2023 16:07:29 -0500 X-MC-Unique: NO2oNo4cMVqtyQr1px_y-A-1 Received: by mail-il1-f198.google.com with SMTP id s12-20020a056e021a0c00b0030efd0ed890so10104289ild.7 for ; Tue, 31 Jan 2023 13:07:29 -0800 (PST) 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=bmwLjQssg8Wov3RNm1Mm2QpTRLDsTn/ZDtOGWTFeDbM=; b=qzSlvcGkObK8qs5IG7p9ETJiaEvmHKF+JBqVNrjk0X8QvbgtFWD6X7hP/UzRnwvWAk pFvj1l6njZAG7CBdo9qVTb4v0kBr69TLX8pifUT/PQZKbJBG8DrWNmtQLM40F3vNX6EP VzwlzLo38ZQ0Ymy7KREfIl9HqPigTPB2TnX48qBRvEhP/N+aZRakNiINfG/mNfJxvwah 5DyzheHOFYqqiwLrBF+CYuKWxF6Gj2eZKCM41E7bs1pFOfui/99HA9QwJGa+aaOEsZVt A75QaLrR1pUL5tIBtEI20VFXTxzaY5lORvO4aKrGWl2CBNrGVYh9W7+BG8LFuiHbHaOU kd8Q== X-Gm-Message-State: AO0yUKVL4CqLAImp9/1nhT/+9TfGtHhbdyuplHf620c2KvZIe9eC36dL Gr2ykRs6Xin4XxGD2n3/BHjboevz5kzUljfl9f7HBQLkX7QMm8PjKyicvOlI2FOK6OUrB7qiGhG vncgm+8PFrmA0Atm7FkMM X-Received: by 2002:a05:6e02:1a04:b0:310:e889:c53e with SMTP id s4-20020a056e021a0400b00310e889c53emr56815ild.5.1675199248252; Tue, 31 Jan 2023 13:07:28 -0800 (PST) X-Google-Smtp-Source: AK7set83Vtl1Xm6lMcNMLF0NuGh4+4APD7byfNtrwxZ6KyyTEHXg9PyLfj1NklsOihFwuQ9J+a8lQA== X-Received: by 2002:a05:6e02:1a04:b0:310:e889:c53e with SMTP id s4-20020a056e021a0400b00310e889c53emr56806ild.5.1675199247960; Tue, 31 Jan 2023 13:07:27 -0800 (PST) Received: from [192.168.0.241] (192-0-145-146.cpe.teksavvy.com. [192.0.145.146]) by smtp.gmail.com with ESMTPSA id x12-20020a927c0c000000b0030bf2476c5fsm1788619ilc.25.2023.01.31.13.07.27 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 31 Jan 2023 13:07:27 -0800 (PST) Message-ID: <9eec4720-3c51-64ef-657f-66b6c81e862b@redhat.com> Date: Tue, 31 Jan 2023 16:07:26 -0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.6.0 Subject: Re: [PATCH] libio: Update number of written bytes in dprintf implementation To: Florian Weimer , libc-alpha@sourceware.org References: <87k013vyb6.fsf@oldenburg.str.redhat.com> From: Carlos O'Donell Organization: Red Hat In-Reply-To: <87k013vyb6.fsf@oldenburg.str.redhat.com> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,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 List-Id: On 1/31/23 04:38, Florian Weimer wrote: > The __printf_buffer_flush_dprintf function needs to record that > the buffer has been written before reusing it. Without this > accounting, dprintf always returns zero. > > Fixes commit 8ece45e4f586abd212d1c02d74d38ef681a45600 > ("libio: Convert __vdprintf_internal to buffers. Tested that regression test catches the error without the patch applied. Tested that the fix corrects the error and correctly adjusts written with the number of bytes that were just written in the lines before in the flush. For dprintf we must flush everything since there is no buffer. The code added looks correct to me and mirrors __wprintf_buffer_flush_to_file (which adjusts written by count), __printf_buffer_flush_to_file (which always accounts for the bytes), __printf_buffer_flush_obstack (always counted object out bytes), and __printf_buffer_flush_snprintf (again always counted). Tested without regression on x86_64 and i686. OK for 2.37, pelase commit ASAP since I consider this a release blocker bug fix since it was reported by downstream testing in Fedora as part of the Fedora 38 Alpha testing (using latest glibc development). Reviewed-by: Carlos O'Donell Tested-by: Carlos O'Donell > > Tested on i686-linux-gnu and x86_64-linux-gnu. > > --- > libio/iovdprintf.c | 1 + > stdio-common/Makefile | 1 + > stdio-common/tst-dprintf-length.c | 45 +++++++++++++++++++++++++++++++++++++++ > 3 files changed, 47 insertions(+) > > diff --git a/libio/iovdprintf.c b/libio/iovdprintf.c > index fb359d263d..d9fa886fdf 100644 > --- a/libio/iovdprintf.c > +++ b/libio/iovdprintf.c > @@ -54,6 +54,7 @@ __printf_buffer_flush_dprintf (struct __printf_buffer_dprintf *buf) > } > p += ret; > } > + buf->base.written += buf->base.write_ptr - buf->base.write_base; > buf->base.write_ptr = buf->buf; > } > > diff --git a/stdio-common/Makefile b/stdio-common/Makefile > index da3034d847..34fdd6d1f8 100644 > --- a/stdio-common/Makefile > +++ b/stdio-common/Makefile > @@ -180,6 +180,7 @@ tests := \ > tst-bz11319 \ > tst-bz11319-fortify2 \ > tst-cookie \ > + tst-dprintf-length \ > tst-fdopen \ > tst-ferror \ > tst-fgets \ > diff --git a/stdio-common/tst-dprintf-length.c b/stdio-common/tst-dprintf-length.c > new file mode 100644 > index 0000000000..abe2caf45a > --- /dev/null > +++ b/stdio-common/tst-dprintf-length.c > @@ -0,0 +1,45 @@ > +/* Test that dprintf returns the expected length. > + Copyright (C) 2023 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include > +#include > +#include > +#include > +#include > + > +static int > +do_test (void) > +{ > + /* Use a datagram socket to check that everything arrives in one packet. > + The dprintf function should perform a single write call. */ > + int fds[2]; > + TEST_VERIFY_EXIT (socketpair (AF_LOCAL, SOCK_DGRAM, 0, fds) == 0); > + > + TEST_COMPARE (dprintf (fds[0], "(%d)%s[%d]", 123, "---", 4567), 14); > + > + char buf[32]; > + ssize_t ret = read (fds[1], buf, sizeof (buf)); > + TEST_VERIFY_EXIT (ret > 0); > + TEST_COMPARE_BLOB (buf, ret, "(123)---[4567]", strlen ("(123)---[4567]")); > + > + close (fds[1]); > + close (fds[0]); > + return 0; > +} > + > +#include > > base-commit: 2f39e44a8417b4186a7f15bfeac5d0b557e63e03 > -- Cheers, Carlos.