NetBSD Problem Report #58206
From www@netbsd.org Sat Apr 27 23:43:26 2024
Return-Path: <www@netbsd.org>
Received: from mail.netbsd.org (mail.netbsd.org [199.233.217.200])
(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits))
(Client CN "mail.NetBSD.org", Issuer "mail.NetBSD.org CA" (not verified))
by mollari.NetBSD.org (Postfix) with ESMTPS id CD07F1A9238
for <gnats-bugs@gnats.NetBSD.org>; Sat, 27 Apr 2024 23:43:25 +0000 (UTC)
Message-Id: <20240427234324.E664D1A923A@mollari.NetBSD.org>
Date: Sat, 27 Apr 2024 23:43:24 +0000 (UTC)
From: campbell+netbsd@mumble.net
Reply-To: campbell+netbsd@mumble.net
To: gnats-bugs@NetBSD.org
Subject: sync_with_stdio breaks reads from cin
X-Send-Pr-Version: www-1.0
>Number: 58206
>Category: lib
>Synopsis: sync_with_stdio breaks reads from cin
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: lib-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Sat Apr 27 23:45:00 +0000 2024
>Last-Modified: Mon May 20 11:25:01 +0000 2024
>Originator: Taylor R Campbell
>Release: current, 10, 9
>Organization:
The std::NetBSD++ Foundation
>Environment:
>Description:
In C++, std::ios::sync_with_stdio(false) has the side effect that reading from std::cin sets the eof|fail bits and does nothing to attempt a read from file descriptor 0.
>How-To-Repeat:
$ cat cin.cc
#include <iostream>
using std::cin;
using std::cout;
int
main(void)
{
char buf[1024];
std::ios::sync_with_stdio(false);
cin.read(buf, sizeof buf);
cout << "read " << cin.gcount() << " bytes, "
<< "state " << cin.rdstate()
<< " (eof|fail = " << (cin.eofbit|cin.failbit) << ")"
<< std::endl;
return 0;
}
$ make cin CXXFLAGS=-std=c++11
c++ -std=c++11 -o cin cin.cc
$ echo foo | ./cin
read 0 bytes, state 6 (eof|fail = 6)
If I remove sync_with_stdio:
$ echo foo | ./cin
read 4 bytes, state 6 (eof|fail = 6)
>Fix:
Yes, please!
>Audit-Trail:
From: "Taylor R Campbell" <riastradh@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc:
Subject: PR/58206 CVS commit: src
Date: Sun, 28 Apr 2024 01:21:27 +0000
Module Name: src
Committed By: riastradh
Date: Sun Apr 28 01:21:27 UTC 2024
Modified Files:
src/distrib/sets/lists/debug: mi
src/distrib/sets/lists/tests: mi
src/etc/mtree: NetBSD.dist.tests
Added Files:
src/tests/lib/libstdc++: Makefile h_cin_nosync.cc t_sync_with_stdio.sh
Log Message:
libstdc++: Add test for PR lib/58206, sync_with_stdio busted.
To generate a diff of this commit:
cvs rdiff -u -r1.432 -r1.433 src/distrib/sets/lists/debug/mi
cvs rdiff -u -r1.1312 -r1.1313 src/distrib/sets/lists/tests/mi
cvs rdiff -u -r1.203 -r1.204 src/etc/mtree/NetBSD.dist.tests
cvs rdiff -u -r0 -r1.1 src/tests/lib/libstdc++/Makefile \
src/tests/lib/libstdc++/h_cin_nosync.cc \
src/tests/lib/libstdc++/t_sync_with_stdio.sh
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
From: Taylor R Campbell <riastradh@NetBSD.org>
To: gnats-bugs@NetBSD.org
Cc:
Subject: Re: lib/58206: sync_with_stdio breaks reads from cin
Date: Mon, 29 Apr 2024 19:37:26 +0000
Followup change to fix build with new test in case of pullups:
https://mail-index.netbsd.org/source-changes/2024/04/28/msg151018.html
From: "Leonardo Taccari" <leot@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc:
Subject: PR/58206 CVS commit: pkgsrc/security/git-crypt
Date: Sat, 4 May 2024 11:07:17 +0000
Module Name: pkgsrc
Committed By: leot
Date: Sat May 4 11:07:17 UTC 2024
Modified Files:
pkgsrc/security/git-crypt: distinfo
pkgsrc/security/git-crypt/patches: patch-util.cpp
Log Message:
git-crypt: Reference PR lib/58206
Seems exactly the same problem. Add a reference to it so once it is
addressed we can wait a couple of years and G/C this patch too.
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 pkgsrc/security/git-crypt/distinfo
cvs rdiff -u -r1.1 -r1.2 pkgsrc/security/git-crypt/patches/patch-util.cpp
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
From: "Taylor R Campbell" <riastradh@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc:
Subject: PR/58206 CVS commit: src
Date: Mon, 20 May 2024 11:20:53 +0000
Module Name: src
Committed By: riastradh
Date: Mon May 20 11:20:53 UTC 2024
Modified Files:
src/external/gpl3/gcc/dist/libstdc++-v3/config/io: basic_file_stdio.cc
src/tests/lib/libstdc++: t_sync_with_stdio.sh
Log Message:
libstdc++: Don't try to fflush stdin.
It doesn't work. It's undefined behaviour. On NetBSD, it will fail
with EBADF, if fd 0 isn't open for write, or if fd 0 is open for
write, it will write heap garbage to fd 0.
If stream points to an output stream or an update stream in which
the most recent operation was not input, the fflush function causes
any unwritten data for that stream to be delivered to the host
environment to be written to the file; otherwise, the behavior is
undefined.
(ISO C11 and ISO C17, Sec. 7.21.5.2 `The fflush function')
PR lib/58206
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114879
To generate a diff of this commit:
cvs rdiff -u -r1.1.1.13 -r1.2 \
src/external/gpl3/gcc/dist/libstdc++-v3/config/io/basic_file_stdio.cc
cvs rdiff -u -r1.1 -r1.2 src/tests/lib/libstdc++/t_sync_with_stdio.sh
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
(Contact us)
$NetBSD: query-full-pr,v 1.47 2022/09/11 19:34:41 kim Exp $
$NetBSD: gnats_config.sh,v 1.9 2014/08/02 14:16:04 spz Exp $
Copyright © 1994-2024
The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.