mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-08 15:42:07 +08:00
re PR libstdc++/26777 (sync_with_stdio(false) triggers bug with sgetc and pubseekoff)
2006-03-22 Paolo Carlini <pcarlini@suse.de> PR libstdc++/26777 * include/bits/fstream.tcc (basic_filebuf<>::_M_seek): Check the return value of _M_file.seekoff. * testsuite/27_io/basic_filebuf/seekoff/char/26777.cc: New. From-SVN: r112286
This commit is contained in:
parent
f328a23a46
commit
d4d21a0103
@ -1,3 +1,10 @@
|
||||
2006-03-22 Paolo Carlini <pcarlini@suse.de>
|
||||
|
||||
PR libstdc++/26777
|
||||
* include/bits/fstream.tcc (basic_filebuf<>::_M_seek): Check
|
||||
the return value of _M_file.seekoff.
|
||||
* testsuite/27_io/basic_filebuf/seekoff/char/26777.cc: New.
|
||||
|
||||
2006-03-21 Paolo Carlini <pcarlini@suse.de>
|
||||
|
||||
PR libstdc++/25482
|
||||
|
@ -1,6 +1,6 @@
|
||||
// File based streams -*- C++ -*-
|
||||
|
||||
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
|
||||
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
|
||||
// Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
@ -740,12 +740,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||
{
|
||||
// Returns pos_type(off_type(-1)) in case of failure.
|
||||
__ret = pos_type(_M_file.seekoff(__off, __way));
|
||||
_M_reading = false;
|
||||
_M_writing = false;
|
||||
_M_ext_next = _M_ext_end = _M_ext_buf;
|
||||
_M_set_buffer(-1);
|
||||
_M_state_cur = __state;
|
||||
__ret.state(_M_state_cur);
|
||||
if (__ret != pos_type(off_type(-1)))
|
||||
{
|
||||
_M_reading = false;
|
||||
_M_writing = false;
|
||||
_M_ext_next = _M_ext_end = _M_ext_buf;
|
||||
_M_set_buffer(-1);
|
||||
_M_state_cur = __state;
|
||||
__ret.state(_M_state_cur);
|
||||
}
|
||||
}
|
||||
return __ret;
|
||||
}
|
||||
|
@ -0,0 +1,86 @@
|
||||
// { dg-require-fork "" }
|
||||
// { dg-require-mkfifo "" }
|
||||
|
||||
// 2006-03-22 Paolo Carlini <pcarlini@suse.de>
|
||||
|
||||
// Copyright (C) 2006 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, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
// USA.
|
||||
|
||||
#include <testsuite_hooks.h>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
// libstdc++/26777
|
||||
void test01()
|
||||
{
|
||||
using namespace std;
|
||||
using namespace __gnu_test;
|
||||
|
||||
bool test __attribute__((unused)) = true;
|
||||
|
||||
const char* name = "tmp_fifo6";
|
||||
|
||||
signal(SIGPIPE, SIG_IGN);
|
||||
|
||||
unlink(name);
|
||||
mkfifo(name, S_IRWXU);
|
||||
semaphore s1, s2;
|
||||
|
||||
int child = fork();
|
||||
VERIFY( child != -1 );
|
||||
|
||||
if (child == 0)
|
||||
{
|
||||
filebuf fbout;
|
||||
fbout.open(name, ios_base::in | ios_base::out);
|
||||
VERIFY( fbout.is_open() );
|
||||
fbout.sputn("Whatever", 8);
|
||||
fbout.pubsync();
|
||||
s1.signal();
|
||||
s2.wait();
|
||||
fbout.close();
|
||||
s1.signal();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
filebuf fbin;
|
||||
fbin.open(name, ios::in);
|
||||
s1.wait();
|
||||
|
||||
fbin.sgetc();
|
||||
fbin.pubseekoff(0, ios::cur, ios::in);
|
||||
s2.signal();
|
||||
s1.wait();
|
||||
|
||||
ostringstream oss;
|
||||
oss << &fbin;
|
||||
fbin.close();
|
||||
|
||||
VERIFY( oss.str() == "Whatever" );
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test01();
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user