From 8dcaff2850b7081696175bf6ae6b5f7021cbea3c Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Thu, 2 Oct 2003 22:37:06 +0200 Subject: [PATCH] re PR libstdc++/12232 (Incorrect handling of openmode argument in filebuf::seekoff and seekpos) 2003-10-02 Paolo Carlini PR libstdc++/12232 * include/bits/fstream.tcc (seekoff): Ignore the openmode argument; simplify. * config/io/basic_file_stdio.h (__basic_file::seekoff, seekpos): Remove the openmode argument. * config/io/basic_file_stdio.cc (__basic_file::seekoff, seekpos): Remove redundant placeholder for the openmode argument. * testsuite/27_io/basic_filebuf/seekoff/char/12232.cc: New. * testsuite/27_io/basic_filebuf/seekoff/char/3-in.cc: Tweak. * testsuite/27_io/basic_filebuf/seekoff/char/3-out.cc: Likewise. * testsuite/27_io/basic_filebuf/seekpos/char/3-in.cc: Likewise. * testsuite/27_io/basic_filebuf/seekpos/char/3-out.cc: Likewise. From-SVN: r72048 --- libstdc++-v3/ChangeLog | 15 +++++ libstdc++-v3/config/io/basic_file_stdio.cc | 5 +- libstdc++-v3/config/io/basic_file_stdio.h | 6 +- libstdc++-v3/include/bits/fstream.tcc | 15 +++-- .../27_io/basic_filebuf/seekoff/char/12232.cc | 72 ++++++++++++++++++++++ .../27_io/basic_filebuf/seekoff/char/3-in.cc | 10 ++- .../27_io/basic_filebuf/seekoff/char/3-out.cc | 8 +-- .../27_io/basic_filebuf/seekpos/char/3-in.cc | 10 ++- .../27_io/basic_filebuf/seekpos/char/3-out.cc | 10 ++- 9 files changed, 115 insertions(+), 36 deletions(-) create mode 100644 libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/12232.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 7224004..2cc15ac 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,18 @@ +2003-10-02 Paolo Carlini + + PR libstdc++/12232 + * include/bits/fstream.tcc (seekoff): Ignore the openmode + argument; simplify. + * config/io/basic_file_stdio.h (__basic_file::seekoff, + seekpos): Remove the openmode argument. + * config/io/basic_file_stdio.cc (__basic_file::seekoff, + seekpos): Remove redundant placeholder for the openmode argument. + * testsuite/27_io/basic_filebuf/seekoff/char/12232.cc: New. + * testsuite/27_io/basic_filebuf/seekoff/char/3-in.cc: Tweak. + * testsuite/27_io/basic_filebuf/seekoff/char/3-out.cc: Likewise. + * testsuite/27_io/basic_filebuf/seekpos/char/3-in.cc: Likewise. + * testsuite/27_io/basic_filebuf/seekpos/char/3-out.cc: Likewise. + 2003-10-02 Benjamin Kosnik * src/locale.cc (locale::_S_initialize): Use __gthread_active_p. diff --git a/libstdc++-v3/config/io/basic_file_stdio.cc b/libstdc++-v3/config/io/basic_file_stdio.cc index b531906..b3223f5 100644 --- a/libstdc++-v3/config/io/basic_file_stdio.cc +++ b/libstdc++-v3/config/io/basic_file_stdio.cc @@ -261,12 +261,11 @@ namespace std } streampos - __basic_file::seekoff(streamoff __off, ios_base::seekdir __way, - ios_base::openmode /*__mode*/) + __basic_file::seekoff(streamoff __off, ios_base::seekdir __way) { return lseek(this->fd(), __off, __way); } streampos - __basic_file::seekpos(streampos __pos, ios_base::openmode /*__mode*/) + __basic_file::seekpos(streampos __pos) { return lseek(this->fd(), __pos, ios_base::beg); } int diff --git a/libstdc++-v3/config/io/basic_file_stdio.h b/libstdc++-v3/config/io/basic_file_stdio.h index 2b1a987..2ff2ba4 100644 --- a/libstdc++-v3/config/io/basic_file_stdio.h +++ b/libstdc++-v3/config/io/basic_file_stdio.h @@ -98,12 +98,10 @@ namespace std xsgetn(char* __s, streamsize __n); streampos - seekoff(streamoff __off, ios_base::seekdir __way, - ios_base::openmode __mode = ios_base::in | ios_base::out); + seekoff(streamoff __off, ios_base::seekdir __way); streampos - seekpos(streampos __pos, - ios_base::openmode __mode = ios_base::in | ios_base::out); + seekpos(streampos __pos); int sync(); diff --git a/libstdc++-v3/include/bits/fstream.tcc b/libstdc++-v3/include/bits/fstream.tcc index 3117555..4a7ad85 100644 --- a/libstdc++-v3/include/bits/fstream.tcc +++ b/libstdc++-v3/include/bits/fstream.tcc @@ -572,15 +572,18 @@ namespace std return this; } + + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // According to 27.8.1.4 p11 - 13 (for seekoff) and the resolution of + // DR 171 (for seekpos), both functions should ignore the last argument + // (of type openmode). template typename basic_filebuf<_CharT, _Traits>::pos_type basic_filebuf<_CharT, _Traits>:: - seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode) + seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode) { pos_type __ret = pos_type(off_type(-1)); - const bool __testin = (ios_base::in & this->_M_mode & __mode) != 0; - const bool __testout = (ios_base::out & this->_M_mode & __mode) != 0; - + int __width = 0; if (_M_codecvt) __width = _M_codecvt->encoding(); @@ -588,7 +591,7 @@ namespace std __width = 0; const bool __testfail = __off != 0 && __width <= 0; - if (this->is_open() && !__testfail && (__testin || __testout)) + if (this->is_open() && !__testfail) { // Ditch any pback buffers to avoid confusion. _M_destroy_pback(); @@ -618,7 +621,7 @@ namespace std } // Returns pos_type(off_type(-1)) in case of failure. - __ret = _M_file.seekoff(__computed_off, __way, __mode); + __ret = _M_file.seekoff(__computed_off, __way); _M_reading = false; _M_writing = false; diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/12232.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/12232.cc new file mode 100644 index 0000000..4301831 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/12232.cc @@ -0,0 +1,72 @@ +// Copyright (C) 2003 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This 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 General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// 27.8.1.4 Overridden virtual functions + +#include +#include + +const char name[] = "tmp_12232"; + +// libstdc++/12232 +void test01() +{ + using namespace std; + bool test __attribute__((unused)) = true; + + filebuf fbout; + fbout.open(name, ios_base::out); + fbout.sputn("abc", 3); + + streampos p1 = fbout.pubseekoff(0, ios_base::cur, ios_base::in); + VERIFY( p1 != streampos(-1) ); + fbout.sputn("de", 2); + + streampos p2 = fbout.pubseekpos(p1, ios_base::openmode()); + VERIFY( p2 != streampos(-1) ); + fbout.sputn("34", 2); + + streampos p3 = fbout.pubseekoff(0, ios_base::beg, ios_base::ate); + VERIFY( p3 != streampos(-1) ); + fbout.sputn("012", 3); + + fbout.close(); + + filebuf fbin; + fbin.open(name, ios_base::in); + + streampos p4 = fbin.pubseekoff(0, ios_base::beg, ios_base::ate); + VERIFY( p4 != streampos(-1) ); + VERIFY( fbin.sgetc() == '0' ); + + streampos p5 = fbin.pubseekoff(-1, ios_base::end, ios_base::out); + VERIFY( p5 != streampos(-1) ); + VERIFY( fbin.sbumpc() == '4' ); + + streampos p6 = fbin.pubseekpos(p4, ios_base::binary); + VERIFY( p6 != streampos(-1) ); + VERIFY( fbin.sbumpc() == '0' ); + + fbin.close(); +} + +int main() +{ + void test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-in.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-in.cc index 2a798db..3d28f6f 100644 --- a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-in.cc +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-in.cc @@ -34,15 +34,13 @@ void test02(std::filebuf& in, bool pass) // seekoff p = in.pubseekoff(0, ios_base::beg, ios_base::in); - if (pass) - VERIFY( p != bad ); + VERIFY( pass == (p != bad) ); - p = in.pubseekoff(0, ios_base::beg, ios_base::out); - VERIFY( p == bad ); + p = in.pubseekoff(0, ios_base::beg, ios_base::out); + VERIFY( pass == (p != bad) ); // See libstdc++/12232 p = in.pubseekoff(0, ios_base::beg); - if (pass) - VERIFY( p != bad ); + VERIFY( pass == (p != bad) ); } const char name_01[] = "filebuf_virtuals-1.tst"; // file with data in it diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-out.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-out.cc index d803e55..fda7be2 100644 --- a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-out.cc +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekoff/char/3-out.cc @@ -34,15 +34,13 @@ void test02(std::filebuf& in, bool pass) // seekoff p = in.pubseekoff(0, ios_base::beg, ios_base::in); - VERIFY( p == bad ); + VERIFY( pass == (p != bad) ); // See libstdc++/12232 p = in.pubseekoff(0, ios_base::beg, ios_base::out); - if (pass) - VERIFY( p != bad ); + VERIFY( pass == (p != bad) ); p = in.pubseekoff(0, ios_base::beg); - if (pass) - VERIFY( p != bad ); + VERIFY( pass == (p != bad) ); } const char name_01[] = "filebuf_virtuals-1.tst"; // file with data in it diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-in.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-in.cc index 39f18de..e18030a 100644 --- a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-in.cc +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-in.cc @@ -34,15 +34,13 @@ void test02(std::filebuf& in, bool pass) // seekpos p = in.pubseekpos(0, ios_base::in); - if (pass) - VERIFY( p != bad ); + VERIFY( pass == (p != bad) ); - p = in.pubseekpos(0, ios_base::out); - VERIFY( p == bad ); + p = in.pubseekpos(0, ios_base::out); + VERIFY( pass == (p != bad) ); // See libstdc++/12232 p = in.pubseekpos(0); - if (pass) - VERIFY( p != bad ); + VERIFY( pass == (p != bad) ); } const char name_01[] = "filebuf_virtuals-1.tst"; // file with data in it diff --git a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-out.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-out.cc index 9dd1ab8..ecd8433 100644 --- a/libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-out.cc +++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/seekpos/char/3-out.cc @@ -34,15 +34,13 @@ void test02(std::filebuf& in, bool pass) // seekpos p = in.pubseekpos(0, ios_base::in); - VERIFY( p == bad ); + VERIFY( pass == (p != bad) ); // See libstdc++/12232 p = in.pubseekpos(0, ios_base::out); - if (pass) - VERIFY( p != bad ); + VERIFY( pass == (p != bad) ); - p = in.pubseekpos(0); - if (pass) - VERIFY( p != bad ); + p = in.pubseekpos(0); + VERIFY( pass == (p != bad) ); } const char name_01[] = "filebuf_virtuals-1.tst"; // file with data in it -- 2.7.4