diff --git a/cJSON.c b/cJSON.c index 204b863f..fb6caca6 100644 --- a/cJSON.c +++ b/cJSON.c @@ -32,20 +32,6 @@ #include #include "cJSON.h" -/* Determine the number of bits that an integer has using the preprocessor */ -#if INT_MAX == 32767 - /* 16 bits */ - #define INTEGER_SIZE 0x0010 -#elif INT_MAX == 2147483647 - /* 32 bits */ - #define INTEGER_SIZE 0x0100 -#elif INT_MAX == 9223372036854775807 - /* 64 bits */ - #define INTEGER_SIZE 0x1000 -#else - #error "Failed to determine the size of an integer" -#endif - /* define our own boolean type */ typedef int cjbool; #define true ((cjbool)1) @@ -223,27 +209,6 @@ double cJSON_SetNumberHelper(cJSON *object, double number) return object->valuedouble = number; } -/* calculate the next largest power of 2 */ -static int pow2gt (int x) -{ - --x; - - x |= x >> 1; - x |= x >> 2; - x |= x >> 4; -#if INTEGER_SIZE & 0x1110 /* at least 16 bit */ - x |= x >> 8; -#endif -#if INTEGER_SIZE & 0x1100 /* at least 32 bit */ - x |= x >> 16; -#endif -#if INTEGER_SIZE & 0x1000 /* 64 bit */ - x |= x >> 32; -#endif - - return x + 1; -} - typedef struct { unsigned char *buffer; @@ -278,7 +243,21 @@ static unsigned char* ensure(printbuffer *p, size_t needed) return NULL; } - newsize = (size_t) pow2gt((int)needed); + /* calculate new buffer size */ + newsize = needed * 2; + if (newsize > INT_MAX) + { + /* overflow of int, use INT_MAX if possible */ + if (needed <= INT_MAX) + { + newsize = INT_MAX; + } + else + { + return NULL; + } + } + newbuffer = (unsigned char*)cJSON_malloc(newsize); if (!newbuffer) {