Don't lock string streams in stream cleanup code
authorUlrich Drepper <drepper@gmail.com>
Fri, 9 Sep 2011 20:15:25 +0000 (16:15 -0400)
committerUlrich Drepper <drepper@gmail.com>
Fri, 9 Sep 2011 20:15:25 +0000 (16:15 -0400)
ChangeLog
NEWS
libio/genops.c

index 007b61c..f1b1c0d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2011-09-09  Ulrich Drepper  <drepper@gmail.com>
+
+       [BZ #12847]
+       * libio/genops.c (INTDEF): For string streams the _lock pointer can
+       be NULL.  Don't lock in this case.
+
 2011-07-29  Denis Zaitceff  <zaitceff@gmail.com>
 
        * string/strncat.c (strncat): Undef the symbol in case it has been
diff --git a/NEWS b/NEWS
index e42adbc..9fa55ca 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -9,8 +9,8 @@ Version 2.15
 
 * The following bugs are resolved with this release:
 
-  9696, 12403, 12868, 12852, 12874, 12885, 12907, 12922, 12935, 13007,
-  13021, 13068, 13092, 13114, 13118, 13123, 13134, 13150
+  9696, 12403, 12847, 12868, 12852, 12874, 12885, 12907, 12922, 12935,
+  13007, 13021, 13068, 13092, 13114, 13118, 13123, 13134, 13150
 
 * New program pldd to list loaded object of a process
   Implemented by Ulrich Drepper.
index 481fbc5..5d21c42 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993,1995,1997-2002, 2003, 2004, 2006, 2007
+/* Copyright (C) 1993,1995,1997-2002, 2003, 2004, 2006, 2007, 2011
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -471,7 +471,7 @@ _IO_default_xsputn (f, data, n)
              f->_IO_write_ptr += count;
 #endif
              s += count;
-            }
+           }
          else if (count)
            {
              char *p = f->_IO_write_ptr;
@@ -479,9 +479,9 @@ _IO_default_xsputn (f, data, n)
              for (i = count; --i >= 0; )
                *p++ = *s++;
              f->_IO_write_ptr = p;
-            }
+           }
          more -= count;
-        }
+       }
       if (more == 0 || _IO_OVERFLOW (f, (unsigned char) *s++) == EOF)
        break;
       more--;
@@ -534,9 +534,9 @@ _IO_default_xsgetn (fp, data, n)
              while (--i >= 0)
                *s++ = *p++;
              fp->_IO_read_ptr = p;
-            }
-            more -= count;
-        }
+           }
+           more -= count;
+       }
       if (more == 0 || __underflow (fp) == EOF)
        break;
     }
@@ -959,7 +959,7 @@ _IO_unbuffer_write (void)
          int cnt;
 #define MAXTRIES 2
          for (cnt = 0; cnt < MAXTRIES; ++cnt)
-           if (_IO_lock_trylock (*fp->_lock) == 0)
+           if (fp->_lock == NULL || _IO_lock_trylock (*fp->_lock) == 0)
              break;
            else
              /* Give the other thread time to finish up its use of the
@@ -978,7 +978,7 @@ _IO_unbuffer_write (void)
 
          _IO_SETBUF (fp, NULL, 0);
 
-         if (cnt < MAXTRIES)
+         if (cnt < MAXTRIES && fp->_lock != NULL)
            _IO_lock_unlock (*fp->_lock);
        }