re PR libstdc++/14975 ([3.4 only] Segfault on low-level write error during imbue)

2004-04-16  Paolo Carlini  <pcarlini@suse.de>

	PR libstdc++/14975
	* include/bits/fstream.tcc (basic_filebuf::imbue): Zero _M_codecvt
	in case of error.
	* testsuite/27_io/basic_filebuf/imbue/char/14975-1.cc: New.
	* testsuite/27_io/basic_filebuf/imbue/wchar_t/14975-2.cc: New.

From-SVN: r80753
This commit is contained in:
Paolo Carlini 2004-04-16 16:06:21 +00:00 committed by Paolo Carlini
parent c805f22eca
commit 2f228199b9
4 changed files with 160 additions and 0 deletions

View File

@ -1,3 +1,11 @@
2004-04-16 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/14975
* include/bits/fstream.tcc (basic_filebuf::imbue): Zero _M_codecvt
in case of error.
* testsuite/27_io/basic_filebuf/imbue/char/14975-1.cc: New.
* testsuite/27_io/basic_filebuf/imbue/wchar_t/14975-2.cc: New.
2004-04-16 Paolo Carlini <pcarlini@suse.de>
* acconfig.h: Remove _GLIBCXX_USE_LONG_DOUBLE entry, not

View File

@ -786,6 +786,8 @@ namespace std
if (__testvalid)
_M_codecvt = _M_codecvt_tmp;
else
_M_codecvt = 0;
}
// Inhibit implicit instantiations for required instantiations,

View File

@ -0,0 +1,67 @@
// 2004-04-16 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2004 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 <fstream>
#include <locale>
#include <testsuite_hooks.h>
class Buf : public std::filebuf
{
protected:
virtual int_type
overflow(int_type c = traits_type::eof())
{
return traits_type::eq_int_type(c, traits_type::eof()) ?
traits_type::eof() : std::filebuf::overflow(c);
}
};
// libstdc++/14975
void test01()
{
using namespace std;
bool test __attribute__((unused)) = true;
Buf fb;
locale loc_us = __gnu_test::try_named_locale("en_US");
fb.pubimbue(loc_us);
fb.open("tmp_14975-1", ios_base::out);
try
{
fb.sputc('a');
fb.sputc('b');
fb.pubimbue(locale::classic());
fb.sputc('c');
fb.pubsync();
fb.close();
}
catch (std::exception&)
{
}
}
int main()
{
test01();
return 0;
}

View File

@ -0,0 +1,83 @@
// 2004-04-16 Petur Runolfsson <peturr02@ru.is>
// Copyright (C) 2004 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.
#include <fstream>
#include <locale>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <testsuite_hooks.h>
// libstdc++/14975
void test01()
{
using namespace std;
using namespace __gnu_test;
bool test __attribute__((unused)) = true;
locale loc_us = try_named_locale("en_US");
const char* name = "tmp_14975-2";
signal(SIGPIPE, SIG_IGN);
unlink(name);
try_mkfifo(name, S_IRWXU);
int child = fork();
VERIFY( child != -1 );
if (child == 0)
{
filebuf fbin;
fbin.open(name, ios_base::in);
sleep(2);
exit(0);
}
wfilebuf fb;
fb.pubimbue(loc_us);
sleep(1);
wfilebuf* ret = fb.open(name, ios_base::out);
VERIFY( ret != NULL );
VERIFY( fb.is_open() );
sleep(3);
try
{
fb.sputc(L'a');
fb.sputc(L'b');
fb.pubimbue(locale::classic());
fb.sputc(L'c');
fb.close();
}
catch (std::exception&)
{
}
}
int main()
{
test01();
return 0;
}