From: Antony Dovgal Date: Tue, 20 Feb 2007 12:00:41 +0000 (+0000) Subject: fix #40545 (multithreading issue in zend_strtod()) X-Git-Tag: RELEASE_1_0_1~210 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0ea9b84302d7de79207939b26b65ac1bd155d43d;p=php fix #40545 (multithreading issue in zend_strtod()) --- diff --git a/Zend/zend_strtod.c b/Zend/zend_strtod.c index ad27f7fd4c..46e9b182fa 100644 --- a/Zend/zend_strtod.c +++ b/Zend/zend_strtod.c @@ -413,7 +413,10 @@ struct Bigint { typedef struct Bigint Bigint; +/* static variables, multithreading fun! */ static Bigint *freelist[Kmax+1]; +static Bigint *p5s; + static void destroy_freelist(void); #ifdef ZTS @@ -757,28 +760,25 @@ static Bigint * s2b (CONST char *s, int nd0, int nd, ULong y9) return b; } - -static Bigint *p5s; - static Bigint * pow5mult(Bigint *b, int k) { Bigint *b1, *p5, *p51; int i; static int p05[3] = { 5, 25, 125 }; + _THREAD_PRIVATE_MUTEX_LOCK(pow5mult_mutex); if ((i = k & 3)) { b = multadd(b, p05[i-1], 0); } if (!(k >>= 2)) { + _THREAD_PRIVATE_MUTEX_UNLOCK(pow5mult_mutex); return b; } if (!(p5 = p5s)) { /* first time */ - _THREAD_PRIVATE_MUTEX_LOCK(pow5mult_mutex); p5 = p5s = i2b(625); p5->next = 0; - _THREAD_PRIVATE_MUTEX_UNLOCK(pow5mult_mutex); } for(;;) { if (k & 1) { @@ -790,15 +790,14 @@ static Bigint * pow5mult(Bigint *b, int k) break; } if (!(p51 = p5->next)) { - _THREAD_PRIVATE_MUTEX_LOCK(pow5mult_mutex); if (!(p51 = p5->next)) { p51 = p5->next = mult(p5,p5); p51->next = 0; } - _THREAD_PRIVATE_MUTEX_UNLOCK(pow5mult_mutex); } p5 = p51; } + _THREAD_PRIVATE_MUTEX_UNLOCK(pow5mult_mutex); return b; }