svn commit: r197061 - stable/6/contrib/gdtoa
Attilio Rao
attilio at FreeBSD.org
Thu Sep 10 12:55:09 UTC 2009
Author: attilio
Date: Thu Sep 10 12:55:09 2009
New Revision: 197061
URL: http://svn.freebsd.org/changeset/base/197061
Log:
MFC r196916:
Fix a list overrun.
Sponsored by: Sandvine Incorporated
Modified:
stable/6/contrib/gdtoa/gdtoaimp.h
stable/6/contrib/gdtoa/misc.c
Modified: stable/6/contrib/gdtoa/gdtoaimp.h
==============================================================================
--- stable/6/contrib/gdtoa/gdtoaimp.h Thu Sep 10 12:42:36 2009 (r197060)
+++ stable/6/contrib/gdtoa/gdtoaimp.h Thu Sep 10 12:55:09 2009 (r197061)
@@ -479,7 +479,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/6/contrib/gdtoa/misc.c
==============================================================================
--- stable/6/contrib/gdtoa/misc.c Thu Sep 10 12:42:36 2009 (r197060)
+++ stable/6/contrib/gdtoa/misc.c Thu Sep 10 12:55:09 2009 (r197061)
@@ -61,7 +61,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 {
@@ -71,7 +73,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;
}
@@ -95,10 +97,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);
+ }
}
}
More information about the svn-src-all
mailing list