Prevent NULL ptr accesses due to Balloc out of memory
- add new eBalloc macro to mprec.h which calls Balloc and aborts if Balloc fails due to out of memory - change mprec.c functions that use Balloc without checking to use eBalloc instead - fix dtoa.c to use eBalloc
This commit is contained in:
parent
df5c79f30c
commit
f88aece242
|
@ -423,7 +423,7 @@ _dtoa_r (struct _reent *ptr,
|
|||
for (_REENT_MP_RESULT_K(ptr) = 0; sizeof (_Bigint) - sizeof (__ULong) + j <= i;
|
||||
j <<= 1)
|
||||
_REENT_MP_RESULT_K(ptr)++;
|
||||
_REENT_MP_RESULT(ptr) = Balloc (ptr, _REENT_MP_RESULT_K(ptr));
|
||||
_REENT_MP_RESULT(ptr) = eBalloc (ptr, _REENT_MP_RESULT_K(ptr));
|
||||
s = s0 = (char *) _REENT_MP_RESULT(ptr);
|
||||
|
||||
if (ilim >= 0 && ilim <= Quick_max && try_quick)
|
||||
|
@ -743,7 +743,7 @@ _dtoa_r (struct _reent *ptr,
|
|||
mlo = mhi;
|
||||
if (spec_case)
|
||||
{
|
||||
mhi = Balloc (ptr, mhi->_k);
|
||||
mhi = eBalloc (ptr, mhi->_k);
|
||||
Bcopy (mhi, mlo);
|
||||
mhi = lshift (ptr, mhi, Log2P);
|
||||
}
|
||||
|
|
|
@ -178,7 +178,7 @@ multadd (struct _reent *ptr,
|
|||
{
|
||||
if (wds >= b->_maxwds)
|
||||
{
|
||||
b1 = Balloc (ptr, b->_k + 1);
|
||||
b1 = eBalloc (ptr, b->_k + 1);
|
||||
Bcopy (b1, b);
|
||||
Bfree (ptr, b);
|
||||
b = b1;
|
||||
|
@ -203,11 +203,11 @@ s2b (struct _reent * ptr,
|
|||
x = (nd + 8) / 9;
|
||||
for (k = 0, y = 1; x > y; y <<= 1, k++);
|
||||
#ifdef Pack_32
|
||||
b = Balloc (ptr, k);
|
||||
b = eBalloc (ptr, k);
|
||||
b->_x[0] = y9;
|
||||
b->_wds = 1;
|
||||
#else
|
||||
b = Balloc (ptr, k + 1);
|
||||
b = eBalloc (ptr, k + 1);
|
||||
b->_x[0] = y9 & 0xffff;
|
||||
b->_wds = (b->_x[1] = y9 >> 16) ? 2 : 1;
|
||||
#endif
|
||||
|
@ -317,7 +317,7 @@ i2b (struct _reent * ptr, int i)
|
|||
{
|
||||
_Bigint *b;
|
||||
|
||||
b = Balloc (ptr, 1);
|
||||
b = eBalloc (ptr, 1);
|
||||
b->_x[0] = i;
|
||||
b->_wds = 1;
|
||||
return b;
|
||||
|
@ -346,7 +346,7 @@ mult (struct _reent * ptr, _Bigint * a, _Bigint * b)
|
|||
wc = wa + wb;
|
||||
if (wc > a->_maxwds)
|
||||
k++;
|
||||
c = Balloc (ptr, k);
|
||||
c = eBalloc (ptr, k);
|
||||
for (x = c->_x, xa = x + wc; x < xa; x++)
|
||||
*x = 0;
|
||||
xa = a->_x;
|
||||
|
@ -470,7 +470,7 @@ lshift (struct _reent * ptr, _Bigint * b, int k)
|
|||
n1 = n + b->_wds + 1;
|
||||
for (i = b->_maxwds; n1 > i; i <<= 1)
|
||||
k1++;
|
||||
b1 = Balloc (ptr, k1);
|
||||
b1 = eBalloc (ptr, k1);
|
||||
x1 = b1->_x;
|
||||
for (i = 0; i < n; i++)
|
||||
*x1++ = 0;
|
||||
|
@ -559,7 +559,7 @@ diff (struct _reent * ptr,
|
|||
i = cmp (a, b);
|
||||
if (!i)
|
||||
{
|
||||
c = Balloc (ptr, 0);
|
||||
c = eBalloc (ptr, 0);
|
||||
c->_wds = 1;
|
||||
c->_x[0] = 0;
|
||||
return c;
|
||||
|
@ -573,7 +573,7 @@ diff (struct _reent * ptr,
|
|||
}
|
||||
else
|
||||
i = 0;
|
||||
c = Balloc (ptr, a->_k);
|
||||
c = eBalloc (ptr, a->_k);
|
||||
c->_sign = i;
|
||||
wa = a->_wds;
|
||||
xa = a->_x;
|
||||
|
@ -775,9 +775,9 @@ d2b (struct _reent * ptr,
|
|||
#endif
|
||||
|
||||
#ifdef Pack_32
|
||||
b = Balloc (ptr, 1);
|
||||
b = eBalloc (ptr, 1);
|
||||
#else
|
||||
b = Balloc (ptr, 2);
|
||||
b = eBalloc (ptr, 2);
|
||||
#endif
|
||||
x = b->_x;
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <math.h>
|
||||
#include <float.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
#include <sys/config.h>
|
||||
#include <sys/types.h>
|
||||
#include "../locale/setlocale.h"
|
||||
|
@ -340,6 +341,13 @@ typedef struct _Bigint _Bigint;
|
|||
#define copybits __copybits
|
||||
#define hexnan __hexnan
|
||||
|
||||
#define eBalloc(__reent_ptr, __len) ({ \
|
||||
void *__ptr = Balloc(__reent_ptr, __len); \
|
||||
if (__ptr == NULL) \
|
||||
__assert_func(__FILE__, __LINE__, (char *)0, "Balloc succeeded"); \
|
||||
__ptr; \
|
||||
})
|
||||
|
||||
#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) && !defined(_SMALL_HEXDIG)
|
||||
#define __get_hexdig(x) __hexdig[x] /* NOTE: must evaluate arg only once */
|
||||
#else /* !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) && !defined(_SMALL_HEXDIG) */
|
||||
|
|
Loading…
Reference in New Issue