about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-05-13 17:39:36 +0000
committerUlrich Drepper <drepper@redhat.com>2004-05-13 17:39:36 +0000
commitf7803f5170fb98c3ed464da05412af5964f087b2 (patch)
treecdd852cf0e7f91d15994bdbc92546f7fdaaa8d5b
parent7f4311e8bf2aeb646afabe37ba9d78441e548bc4 (diff)
downloadglibc-f7803f5170fb98c3ed464da05412af5964f087b2.tar.gz
glibc-f7803f5170fb98c3ed464da05412af5964f087b2.tar.xz
glibc-f7803f5170fb98c3ed464da05412af5964f087b2.zip
Update.
2004-05-13  Jakub Jelinek  <jakub@redhat.com>

	* libio/genops.c (_IO_default_xsputn): Avoid one overflow per char if
	count is negative, yet write_ptr < write_end.
	(_IO_default_xsgetn): Avoid one underflow per char if count is
	negative, yet read_ptr < read_end.
-rw-r--r--ChangeLog7
-rw-r--r--libio/genops.c20
2 files changed, 15 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 6dcada2f70..5889b2165e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2004-05-13  Jakub Jelinek  <jakub@redhat.com>
+
+	* libio/genops.c (_IO_default_xsputn): Avoid one overflow per char if
+	count is negative, yet write_ptr < write_end.
+	(_IO_default_xsgetn): Avoid one underflow per char if count is
+	negative, yet read_ptr < read_end.
+
 2004-05-12  Steven Munroe  <sjmunroe@us.ibm.com>
 
 	* sysdeps/unix/sysv/linux/powerpc/bits/termios.h (XTABS): Define XTABS
diff --git a/libio/genops.c b/libio/genops.c
index 5b65e76bea..f233f36d8b 100644
--- a/libio/genops.c
+++ b/libio/genops.c
@@ -447,10 +447,10 @@ _IO_default_xsputn (f, data, n)
   for (;;)
     {
       /* Space available. */
-      _IO_ssize_t count = f->_IO_write_end - f->_IO_write_ptr;
-      if (count > 0)
+      if (f->_IO_write_ptr < f->_IO_write_end)
 	{
-	  if ((_IO_size_t) count > more)
+	  _IO_size_t count = f->_IO_write_end - f->_IO_write_ptr;
+	  if (count > more)
 	    count = more;
 	  if (count > 20)
 	    {
@@ -462,9 +462,7 @@ _IO_default_xsputn (f, data, n)
 #endif
 	      s += count;
             }
-	  else if (count <= 0)
-	    count = 0;
-	  else
+	  else if (count)
 	    {
 	      char *p = f->_IO_write_ptr;
 	      _IO_ssize_t i;
@@ -504,10 +502,10 @@ _IO_default_xsgetn (fp, data, n)
   for (;;)
     {
       /* Data available. */
-      _IO_ssize_t count = fp->_IO_read_end - fp->_IO_read_ptr;
-      if (count > 0)
+      if (fp->_IO_read_ptr < fp->_IO_read_end)
 	{
-	  if ((_IO_size_t) count > more)
+	  _IO_size_t count = fp->_IO_read_end - fp->_IO_read_ptr;
+	  if (count > more)
 	    count = more;
 	  if (count > 20)
 	    {
@@ -519,9 +517,7 @@ _IO_default_xsgetn (fp, data, n)
 #endif
 	      fp->_IO_read_ptr += count;
 	    }
-	  else if (count <= 0)
-	    count = 0;
-	  else
+	  else if (count)
 	    {
 	      char *p = fp->_IO_read_ptr;
 	      int i = (int) count;