diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index cfbb11aa29a1fc771e19d4fc5ee77c24f1b23aaf..b78883113012a7585dc6a2b6f571295f8d38b475 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,16 @@
+2003-04-26  Paolo Carlini  <pcarlini@unitus.it>
+
+	* include/bits/streambuf.tcc (__copy_streambufs): Don't
+	use in_avail(), simplify.
+
+2003-04-26  Paolo Carlini  <pcarlini@unitus.it>
+
+	* include/std/std_sstream.h (setbuf): don't set _M_buf_size,
+	in basic_stringbuf it's unused.
+	
+	* include/std/std_sstream.h (underflow): consistently use
+	_M_in_cur, not gptr().
+
 2003-04-25  Ranjit Mathew  <rmathew@hotmail.com>
             Phil Edwards  <pme@gcc.gnu.org>
 	
diff --git a/libstdc++-v3/include/bits/streambuf.tcc b/libstdc++-v3/include/bits/streambuf.tcc
index dff48d25dfc79121329666784933a00ab9d996aa..8623d25c790b7aff20b5f0b376cd14df3743e5f5 100644
--- a/libstdc++-v3/include/bits/streambuf.tcc
+++ b/libstdc++-v3/include/bits/streambuf.tcc
@@ -188,30 +188,29 @@ namespace std
       typedef typename _Traits::off_type	off_type;
 
       streamsize __ret = 0;
-      streamsize __in_avail = __sbin->in_avail();
-      streamsize __xtrct;
       const off_type __buf_size =
 	__sbin->_M_buf_size > 0 ? __sbin->_M_buf_size : 1;
-
       try 
 	{
-	  while (__in_avail != -1)
+	  for (;;)
   	    {
- 	      if (__in_avail != 0 && __sbin->_M_in_cur
-		  && __sbin->_M_in_cur + __in_avail <= __sbin->_M_in_end) 
+	      streamsize __xtrct;
+	      const off_type __avail = __sbin->_M_in_end
+		                       - __sbin->_M_in_cur;
+ 	      if (__avail)
 		{
-		  __xtrct = __sbout->sputn(__sbin->_M_in_cur, __in_avail);
+		  __xtrct = __sbout->sputn(__sbin->_M_in_cur, __avail);
 		  __ret += __xtrct;
 		  __sbin->_M_in_cur_move(__xtrct);
-		  if (__xtrct != __in_avail)
+		  if (__xtrct != __avail)
 		    break;
 		}
  	      else 
 		{
 		  streamsize __charsread;
-		  const streamsize __size =
-		    std::min(__buf_size, off_type(__sbout->_M_out_end -
-						  __sbout->_M_out_cur));
+		  const off_type __size = std::min(__buf_size,
+						   off_type(__sbout->_M_out_end
+						   - __sbout->_M_out_cur));
 		  if (__size > 1)
 		    {
 		      _CharT* __buf =
@@ -242,7 +241,6 @@ namespace std
 		}
  	      if (_Traits::eq_int_type(__sbin->sgetc(), _Traits::eof()))
   		break;
- 	      __in_avail = __sbin->in_avail();
   	    }
 	}
       catch(exception& __fail) 
diff --git a/libstdc++-v3/include/std/std_sstream.h b/libstdc++-v3/include/std/std_sstream.h
index 48b81cd8d95bb281eb0d400f577f17b24e52ad85..6dc47e551563d48d8b805d94967b8fd9ec3711c2 100644
--- a/libstdc++-v3/include/std/std_sstream.h
+++ b/libstdc++-v3/include/std/std_sstream.h
@@ -191,7 +191,7 @@ namespace std
       underflow()
       {
 	if (this->_M_in_cur < this->_M_in_end)
-	  return traits_type::to_int_type(*gptr());
+	  return traits_type::to_int_type(*this->_M_in_cur);
 	else
 	  return traits_type::eof();
       }
@@ -230,7 +230,6 @@ namespace std
 	    
 	    // Step 2: Use the external array.
 	    this->_M_buf = __s;
-	    this->_M_buf_size = __n;
 	    _M_really_sync(__s, 0, 0);
 	  }
 	return this;