From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 674 invoked by alias); 27 Sep 2002 15:56:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 655 invoked by uid 71); 27 Sep 2002 15:56:02 -0000 Resent-Date: 27 Sep 2002 15:56:02 -0000 Resent-Message-ID: <20020927155602.654.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, lennox@cs.columbia.edu Received: (qmail 11031 invoked by uid 61); 27 Sep 2002 15:48:17 -0000 Message-Id: <20020927154817.11030.qmail@sources.redhat.com> Date: Fri, 27 Sep 2002 08:56:00 -0000 From: lennox@cs.columbia.edu Reply-To: lennox@cs.columbia.edu To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: libstdc++/8071: basic_ostream::operator<<(streambuf*) loops forever if streambuf::underflow() leaves gptr() NULL X-SW-Source: 2002-09/txt/msg00748.txt.bz2 List-Id: >Number: 8071 >Category: libstdc++ >Synopsis: basic_ostream::operator<<(streambuf*) loops forever if streambuf::underflow() leaves gptr() NULL >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Fri Sep 27 08:56:01 PDT 2002 >Closed-Date: >Last-Modified: >Originator: lennox@cs.columbia.edu >Release: gcc-3.1 >Organization: >Environment: sparc-sun-solaris2.8 >Description: According to my reading of the C++ standard, a subclass of std::basic_streambuf<> is allowed to declare its uflow() and underflow() functions such that they don't fill their buffers. This is useful, for instance, if the streambuf is a wrapper around another type that does its own buffering. However, libstdc++'s basic_ostream::operator<<(streambuf*) operator loops forever when passed such a streambuf, repeatedly invoking underflow() and never actually extracting any data from the buffer. I've attached some code written by Matt Austern, and published in the C++ Users Journal. This code creates a streambuf and istream that wraps a C FILE*, so I/O can safely be intermixed on the two types. Using operator<< on the syncbuf this code declares illustrates the problem. >How-To-Repeat: Compile the attached code. (It looks like gnats won't allow me to attach more than one file in the initial bug report, so I've just attached the header. I'll attach the body momentarily.) >Fix: I think the fix needs to change basic_streambuf::__copy_streambufs, but I'm not sure exactly what the fix should be. >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="syncstream.h" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="syncstream.h" Ly8gLSotIEMrKyAtKi0KCi8qIENvZGUgYnkgTWF0dCBBdXN0ZXJuLCBmcm9tIHRoZSBDL0MrKyBV c2VycyBKb3VybmFsOgogKiA8aHR0cDovL3d3dy5jdWouY29tL2V4cGVydHMvMTgxMS9hdXN0ZXJu Lmh0bT90b3BpYz1leHBlcnRzPgogKiBNaW5vciB0d2Vha3MgKHN0ZDo6IGFuZCBjb25zdF9jYXN0 PD4gY29ycmVjdG5lc3MpIGJ5CiAqIEpvbmF0aGFuIExlbm5veCA8bGVubm94QGNzLmNvbHVtYmlh LmVkdT4KICovCgovKiBzeW5jYnVmIGFuZCBpc3luY3N0cmVhbTogc3luY2hyb25pemUgSS9PIG9u IGEgQyBGSUxFKiBhbmQgYQogKiBDKysgaW9zdHJlYW0uICovCgojaW5jbHVkZSA8aW9zdHJlYW0+ CiNpbmNsdWRlIDxzdGRpby5oPgoKI2lmbmRlZiBTWU5DQlVGX0hfCiNkZWZpbmUgU1lOQ0JVRl9I XwoKY2xhc3Mgc3luY2J1ZiA6IHB1YmxpYyBzdGQ6OnN0cmVhbWJ1ZiB7CnB1YmxpYzoKICAgc3lu Y2J1ZihGSUxFKik7Cgpwcm90ZWN0ZWQ6CiAgIHZpcnR1YWwgaW50IG92ZXJmbG93KGludCBjID0g RU9GKTsKICAgdmlydHVhbCBpbnQgdW5kZXJmbG93KCk7CiAgIHZpcnR1YWwgaW50IHVmbG93KCk7 CiAgIHZpcnR1YWwgaW50IHBiYWNrZmFpbChpbnQgYyA9IEVPRik7CiAgIHZpcnR1YWwgaW50IHN5 bmMoKTsKCnByaXZhdGU6CiAgIEZJTEUqIGZwdHI7Cn07CgpzeW5jYnVmOjpzeW5jYnVmKEZJTEUq IGYpCiAgIDogc3RkOjpzdHJlYW1idWYoKSwgZnB0cihmKSB7fQoKaW50IHN5bmNidWY6Om92ZXJm bG93KGludCBjKSB7CiAgIHJldHVybiBjICE9IEVPRiA/IGZwdXRjKGMsIGZwdHIpIDogRU9GOwp9 CgppbnQgc3luY2J1Zjo6dW5kZXJmbG93KCkgewogICBpbnQgYyA9IGdldGMoZnB0cik7CiAgIGlm IChjICE9IEVPRikKICAgICAgdW5nZXRjKGMsIGZwdHIpOwogICByZXR1cm4gYzsKfQoKaW50IHN5 bmNidWY6OnVmbG93KCkgewogICByZXR1cm4gZ2V0YyhmcHRyKTsKfQoKaW50IHN5bmNidWY6OnBi YWNrZmFpbChpbnQgYykgewogICByZXR1cm4gYyAhPSBFT0YgPyB1bmdldGMoYywgZnB0cikgOiBF T0Y7Cn0KCmludCBzeW5jYnVmOjpzeW5jKCkgewogICByZXR1cm4gZmZsdXNoKGZwdHIpOwp9CgoK CmNsYXNzIGlzeW5jc3RyZWFtCiAgIDogcHVibGljIHN0ZDo6aXN0cmVhbSB7CnB1YmxpYzoKICAg aXN5bmNzdHJlYW0oKQogICAgICA6IHN0ZDo6aXN0cmVhbSgmYnVmKSwgYnVmKDApIHt9CiAgIGlz eW5jc3RyZWFtKEZJTEUqIGZwdHIpCiAgICAgIDogc3RkOjppc3RyZWFtKCZidWYpLCBidWYoZnB0 cikge30KICAgc3luY2J1ZiogcmRidWYoKSBjb25zdCB7CiAgICAgIHJldHVybiBjb25zdF9jYXN0 PHN5bmNidWYqPigmYnVmKTsKICAgfQpwcml2YXRlOgogICBzeW5jYnVmIGJ1ZjsKfTsKCiNlbmRp Zgo=