]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix wrap-around in memusage.
authorAndreas Schwab <schwab@redhat.com>
Thu, 29 Oct 2009 18:25:20 +0000 (11:25 -0700)
committerUlrich Drepper <drepper@redhat.com>
Thu, 29 Oct 2009 18:25:20 +0000 (11:25 -0700)
ChangeLog
malloc/memusage.c

index 25bb3255df77e4f84f383abf0ec3011b409b2544..99088df6adc6bbe5f13ce30c9272a9021257d84d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2009-10-29  Andreas Schwab  <schwab@redhat.com>
+
+       * malloc/memusage.c (update_data): Fix index wraparound handling
+       so that buffer_cnt is actually reset.
+
 2009-10-29  Ulrich Drepper  <drepper@redhat.com>
 
        [BZ #10784]
index fcd58dc68499fe453841a998dac0e926e3f0e503..382261c1c48e477210fc8234cb1a5dd8fe0c6dd5 100644 (file)
@@ -163,15 +163,16 @@ update_data (struct header *result, size_t len, size_t old_len)
   if (fd != -1)
     {
       uatomic32_t idx = catomic_exchange_and_add (&buffer_cnt, 1);
-      if (idx >= 2 * buffer_size)
+      if (idx + 1 >= 2 * buffer_size)
        {
          /* We try to reset the counter to the correct range.  If
             this fails because of another thread increasing the
             counter it does not matter since that thread will take
             care of the correction.  */
-         uatomic32_t reset = idx % (2 * buffer_size);
-         catomic_compare_and_exchange_val_acq (&buffer_cnt, reset, idx);
-         idx = reset;
+         uatomic32_t reset = (idx + 1) % (2 * buffer_size);
+         catomic_compare_and_exchange_val_acq (&buffer_cnt, reset, idx + 1);
+         if (idx >= 2 * buffer_size)
+           idx = reset - 1;
        }
       assert (idx < 2 * DEFAULT_BUFFER_SIZE);