diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 30d0c0c049ef48c4c3353bb8ed618fcc223306cc..158f4b2933552344166e29502de92a4119c48fc7 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,12 @@
+2003-02-24  Paolo Carlini  <pcarlini@unitus.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.
+
 2003-02-24  Paolo Carlini <pcarlini@unitus.it>
 	    Nathan Myers <ncm@cantrip.org>
 
diff --git a/libstdc++-v3/src/fstream.cc b/libstdc++-v3/src/fstream.cc
index 944bae27c381187a3f529ddc17485da1d99dc45d..5753e0055cdd64e710324bdea54dc0e3760ceb0f 100644
--- a/libstdc++-v3/src/fstream.cc
+++ b/libstdc++-v3/src/fstream.cc
@@ -53,7 +53,12 @@ namespace std
 	    {
 	      _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 @@ namespace std
 	    {
 	      _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 --git a/libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc b/libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc
index fc9262f8e75007ac25c9464df99e39b8348cfbfb..660abd1752a20964d58496ea08810df78efacec7 100644
--- a/libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc
+++ b/libstdc++-v3/testsuite/27_io/filebuf_virtuals.cc
@@ -73,6 +73,7 @@ const char name_02[] = "filebuf_virtuals-2.txt"; // empty file, need to create
 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 @@ void test11()
   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 @@ main()
   test09();
   test10();
   test11();
+  test12();
   return 0;
 }