Skip to content

Commit

Permalink
ensure: replace pow2gt with multiplication by two
Browse files Browse the repository at this point in the history
This replaces the bit fiddling involved with calculating a new buffer
size by just multiplying the required length by two, paving the way to a
complete switch to size_t at a later point in time.
  • Loading branch information
FSMaxB committed Feb 15, 2017
1 parent 123bb1a commit 9f6fa94
Showing 1 changed file with 15 additions and 36 deletions.
51 changes: 15 additions & 36 deletions cJSON.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,20 +32,6 @@
#include <ctype.h>
#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)
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
{
Expand Down

0 comments on commit 9f6fa94

Please sign in to comment.