1// 1999-10-11 bkoz
2
3// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2009
4// Free Software Foundation, Inc.
5//
6// This file is part of the GNU ISO C++ Library.  This library is free
7// software; you can redistribute it and/or modify it under the
8// terms of the GNU General Public License as published by the
9// Free Software Foundation; either version 3, or (at your option)
10// any later version.
11
12// This library is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15// GNU General Public License for more details.
16
17// You should have received a copy of the GNU General Public License along
18// with this library; see the file COPYING3.  If not see
19// <http://www.gnu.org/licenses/>.
20
21
22// 27.5.2 template class basic_streambuf
23
24#include <fstream>
25#include <testsuite_hooks.h>
26
27class setpbuf : public std::filebuf
28{
29  char 		buffer[4];
30  std::string 	result;
31
32public:
33
34  std::string&
35  get_result()
36  { return result; }
37
38  setpbuf()
39  {
40    this->open("tmp_1057", std::ios_base::out | std::ios_base::trunc);
41    char foo [32];
42    setp(foo, foo + 32);
43    setp(buffer, buffer + 4);
44  }
45
46  ~setpbuf()
47  {
48    sync();
49    close();
50  }
51
52  virtual int_type
53  overflow(int_type n)
54  {
55    if (sync() != 0)
56      return traits_type::eof();
57
58    result += traits_type::to_char_type(n);
59
60    return n;
61  }
62
63  virtual int
64  sync()
65  {
66    result.append(pbase(), pptr());
67    setp(buffer, buffer + 4);
68    return 0;
69  }
70};
71
72// libstdc++/1057
73void test04()
74{
75  bool test __attribute__((unused)) = true;
76  std::string text = "abcdefghijklmn";
77
78  // 01
79  setpbuf sp1;
80  // Here xsputn writes over sp1.result
81  sp1.sputn(text.c_str(), text.length());
82
83  // This crashes when result is accessed
84  sp1.pubsync();
85  VERIFY( sp1.get_result() == text );
86
87  // 02
88  setpbuf sp2;
89  for (std::string::size_type i = 0; i < text.length(); ++i)
90    {
91      // sputc also writes over result
92      sp2.sputc(text[i]);
93    }
94
95  // Crash here
96  sp2.pubsync();
97  VERIFY( sp2.get_result() == text );
98}
99
100int main()
101{
102  test04();
103  return 0;
104}
105