Author: attilio
Date: Thu Sep 10 11:44:51 2009
New Revision: 197059
URL: http://svn.freebsd.org/changeset/base/197059

Log:
  MFC r196916:
  Fix a list overrun.
  
  Sponsored by: Sandvine Incorporated

Modified:
  stable/7/contrib/gdtoa/gdtoaimp.h
  stable/7/contrib/gdtoa/misc.c

Modified: stable/7/contrib/gdtoa/gdtoaimp.h
==============================================================================
--- stable/7/contrib/gdtoa/gdtoaimp.h   Thu Sep 10 11:27:07 2009        
(r197058)
+++ stable/7/contrib/gdtoa/gdtoaimp.h   Thu Sep 10 11:44:51 2009        
(r197059)
@@ -472,7 +472,7 @@ extern pthread_mutex_t __gdtoa_locks[2];
                _pthread_mutex_unlock(&__gdtoa_locks[n]);       \
 } while(0)
 
-#define Kmax 15
+#define Kmax 9
 
  struct
 Bigint {

Modified: stable/7/contrib/gdtoa/misc.c
==============================================================================
--- stable/7/contrib/gdtoa/misc.c       Thu Sep 10 11:27:07 2009        
(r197058)
+++ stable/7/contrib/gdtoa/misc.c       Thu Sep 10 11:44:51 2009        
(r197059)
@@ -55,7 +55,9 @@ Balloc
 #endif
 
        ACQUIRE_DTOA_LOCK(0);
-       if ( (rv = freelist[k]) !=0) {
+       /* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */
+       /* but this case seems very unlikely. */
+       if (k <= Kmax && (rv = freelist[k]) !=0) {
                freelist[k] = rv->next;
                }
        else {
@@ -65,7 +67,7 @@ Balloc
 #else
                len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 
1)
                        /sizeof(double);
-               if (pmem_next - private_mem + len <= PRIVATE_mem) {
+               if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) {
                        rv = (Bigint*)pmem_next;
                        pmem_next += len;
                        }
@@ -89,10 +91,14 @@ Bfree
 #endif
 {
        if (v) {
-               ACQUIRE_DTOA_LOCK(0);
-               v->next = freelist[v->k];
-               freelist[v->k] = v;
-               FREE_DTOA_LOCK(0);
+               if (v->k > Kmax)
+                       free((void*)v);
+               else {
+                       ACQUIRE_DTOA_LOCK(0);
+                       v->next = freelist[v->k];
+                       freelist[v->k] = v;
+                       FREE_DTOA_LOCK(0);
+                       }
                }
        }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to