From: Paolo Carlini Date: Thu, 6 Feb 2003 13:36:39 +0000 (+0000) Subject: [multiple changes] X-Git-Tag: releases/gcc-3.2.3~226 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=86a2a21759817442814d536aac8a0d3ec5313e54;p=thirdparty%2Fgcc.git [multiple changes] 2003-02-06 Paolo Carlini PR libstdc++/9538 * include/bits/streambuf.tcc (sputbackc): Access this->gptr()[-1] only if _M_in_beg < _M_in_cur. * testsuite/27_io/filebuf_virtuals.cc (test08): Add. 2003-02-06 Paolo Carlini PR libstdc++/9507 * include/bits/fstream.tcc (open): If the 'ate' repositioning operation fails, calls close _and_ returns a null pointer to indicate failure (27.8.1.3,4). * testsuite/27_io/filebuf_members.cc (test_06): Add. 2003-02-06 Petur Runolfsson * testsuite/27_io/filebuf_members.cc (test_04): Remove exit(0). From-SVN: r62491 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 002c8f3c7735..c1d98eabc5b0 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,22 @@ +2003-02-06 Paolo Carlini + + PR libstdc++/9538 + * include/bits/streambuf.tcc (sputbackc): Access + this->gptr()[-1] only if _M_in_beg < _M_in_cur. + * testsuite/27_io/filebuf_virtuals.cc (test08): Add. + +2003-02-06 Paolo Carlini + + PR libstdc++/9507 + * include/bits/fstream.tcc (open): If the 'ate' repositioning + operation fails, calls close _and_ returns a null pointer + to indicate failure (27.8.1.3,4). + * testsuite/27_io/filebuf_members.cc (test_06): Add. + +2003-02-06 Petur Runolfsson + + * testsuite/27_io/filebuf_members.cc (test_04): Remove exit(0). + 2003-02-05 Benjamin Kosnik * configure.in (libtool_VERSION): To 5:3:0. diff --git a/libstdc++-v3/include/bits/fstream.tcc b/libstdc++-v3/include/bits/fstream.tcc index 0b3bec1c2630..e9919896914d 100644 --- a/libstdc++-v3/include/bits/fstream.tcc +++ b/libstdc++-v3/include/bits/fstream.tcc @@ -94,7 +94,12 @@ namespace std if ((__mode & ios_base::ate) && this->seekoff(0, ios_base::end, __mode) < 0) - this->close(); + { + // 27.8.1.3,4 + this->close(); + return __ret; + } + __ret = this; } } diff --git a/libstdc++-v3/include/bits/streambuf.tcc b/libstdc++-v3/include/bits/streambuf.tcc index 5f57df583a7b..3f675e9e0463 100644 --- a/libstdc++-v3/include/bits/streambuf.tcc +++ b/libstdc++-v3/include/bits/streambuf.tcc @@ -67,8 +67,7 @@ namespace std { int_type __ret; bool __testpos = _M_in_cur && _M_in_beg < _M_in_cur; - bool __testne = _M_in_cur && !traits_type::eq(__c, this->gptr()[-1]); - if (!__testpos || __testne) + if (!__testpos || !traits_type::eq(__c, this->gptr()[-1])) __ret = this->pbackfail(traits_type::to_int_type(__c)); else { diff --git a/libstdc++-v3/testsuite/27_io/filebuf_members.cc b/libstdc++-v3/testsuite/27_io/filebuf_members.cc index 9f48229f67af..88b05358e7fd 100644 --- a/libstdc++-v3/testsuite/27_io/filebuf_members.cc +++ b/libstdc++-v3/testsuite/27_io/filebuf_members.cc @@ -172,7 +172,6 @@ test_04() } unlink("xxx"); - exit(0); } // Charles Leggett @@ -191,6 +190,33 @@ void test_05() scratch_file.close(); } +// libstdc++/9507 +void test_06() +{ + bool test = true; + + signal(SIGPIPE, SIG_IGN); + + unlink("yyy"); + mkfifo("yyy", S_IRWXU); + + if (!fork()) + { + std::filebuf fbuf; + fbuf.open("yyy", std::ios_base::in); + fbuf.sgetc(); + fbuf.close(); + + exit(0); + } + + std::filebuf fbuf; + std::filebuf* r = + fbuf.open("yyy", std::ios_base::out | std::ios_base::ate); + VERIFY( !fbuf.is_open() ); + VERIFY( r == NULL ); +} + int main() { @@ -199,6 +225,7 @@ main() test_03(); test_04(); test_05(); + test_06(); return 0; } diff --git a/libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc b/libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc index c02e1a77be90..75c2e1cac77c 100644 --- a/libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc +++ b/libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc @@ -537,6 +537,39 @@ void test07() VERIFY( ob.getloc() == loc_de ); } +class MyTraits : public std::char_traits +{ +public: + static bool eq(char c1, char c2) + { + VERIFY( c1 >= 0 ); + VERIFY( c2 >= 0 ); + return std::char_traits::eq(c1, c2); + } +}; + +class MyBuf : public std::basic_streambuf +{ + char buffer[8]; + +public: + MyBuf() + { + std::memset(buffer, -1, sizeof(buffer)); + std::memset(buffer + 2, 0, 4); + setg(buffer + 2, buffer + 2, buffer + 6); + } +}; + +// libstdc++/9538 +void test08() +{ + bool test = true; + + MyBuf mb; + mb.sputbackc(0); +} + main() { test01(); @@ -548,5 +581,6 @@ main() test06(); test07(); + test08(); return 0; }