This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch] Fix libstdc++/9825


Hi,

the below, which seems safe for 3_3 too, fixes a case where we
didn't advance the read pointer before returning from
_M_underflow_common(true) (uflow(), that is).

Tested x86-linux.

Ok?

Paolo.

///////////
2003-02-24  Paolo Carlini  <pcarlini at unitus dot it>

	PR libstdc++/9825
	* src/fstream.cc
	(basic_filebuf<char/wchar_t>_M_underflow_common): When
	__bump is true (uflow), always increment the read pointer
	(_M_in_cur) before returning successfully.
	* testsuite/27_io/filebuf_virtuals.cc (test12): Add.
diff -urN libstdc++-v3-orig/src/fstream.cc libstdc++-v3/src/fstream.cc
--- libstdc++-v3-orig/src/fstream.cc	2003-02-17 20:22:11.000000000 +0100
+++ libstdc++-v3/src/fstream.cc	2003-02-24 14:26:00.000000000 +0100
@@ -53,7 +53,12 @@
 	    {
 	      _M_pback_destroy();
 	      if (_M_in_cur < _M_in_end)
-		return traits_type::to_int_type(*_M_in_cur);
+		{
+		  __ret = traits_type::to_int_type(*_M_in_cur);
+		  if (__bump)
+		    _M_in_cur_move(1);
+		  return __ret;
+		}
 	    }
 
 	  // Sync internal and external buffers.
@@ -128,7 +133,12 @@
 	    {
 	      _M_pback_destroy();
 	      if (_M_in_cur < _M_in_end)
-		return traits_type::to_int_type(*_M_in_cur);
+		{
+		  __ret = traits_type::to_int_type(*_M_in_cur);
+		  if (__bump)
+		    _M_in_cur_move(1);
+	  	  return __ret;
+		}
 	    }
 
 	  // Sync internal and external buffers.
diff -urN libstdc++-v3-orig/testsuite/27_io/filebuf_virtuals.cc libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc
--- libstdc++-v3-orig/testsuite/27_io/filebuf_virtuals.cc	2003-02-24 19:43:01.000000000 +0100
+++ libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc	2003-02-24 20:20:24.000000000 +0100
@@ -73,6 +73,7 @@
 const char name_03[] = "filebuf_virtuals-3.txt"; // empty file, need to create
 const char name_04[] = "filebuf_virtuals-4.txt"; // empty file, need to create
 const char name_05[] = "filebuf_virtuals-5.txt"; // empty file, need to create
+const char name_06[] = "filebuf_virtuals-6.txt"; // empty file, need to create
 
 class derived_filebuf: public std::filebuf
 {
@@ -681,6 +682,28 @@
   dfbuf_02.close();
 }
 
+// libstdc++/9825
+void test12()
+{
+  using namespace std;
+  bool test = true;
+
+  filebuf fbuf;
+
+  fbuf.open(name_06, ios_base::in|ios_base::out|ios_base::trunc);
+  fbuf.sputn("crazy bees!", 11);
+  fbuf.pubseekoff(0, ios_base::beg);
+  fbuf.sbumpc();
+  fbuf.sputbackc('x');
+  filebuf::int_type c = fbuf.sbumpc();
+  VERIFY( c == 'x' );
+  c = fbuf.sbumpc();
+  VERIFY( c == 'r' );
+  c = fbuf.sbumpc();
+  VERIFY( c == 'a' );
+  fbuf.close();  
+}
+
 main() 
 {
   test01();
@@ -696,5 +719,6 @@
   test09();
   test10();
   test11();
+  test12();
   return 0;
 }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]