Skip to content

Commit

Permalink
Fix integer validations during JSON file parsing
Browse files Browse the repository at this point in the history
Fixes #255.
Also deletes a whole bunch of unused code.
  • Loading branch information
ydahhrk committed Nov 28, 2017
1 parent 5a67601 commit 1d44974
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 1,100 deletions.
133 changes: 16 additions & 117 deletions include/nat64/usr/cJSON.h
Expand Up @@ -35,6 +35,12 @@
#define cJSON_IsReference 256
#define cJSON_StringIsConst 512

typedef enum valuenum_flags {
VALUENUM_INT = (1 << 0),
VALUENUM_UINT = (1 << 1),
VALUENUM_DBL = (1 << 2),
} valuenum_flags;

/* The cJSON structure: */
typedef struct cJSON {
/*
Expand All @@ -55,8 +61,9 @@ typedef struct cJSON {
char *valuestring;
/* The item's number, if type==cJSON_Number */
int valueint;
/* The item's number, if type==cJSON_Number */
unsigned int valueuint;
double valuedouble;
valuenum_flags numflags;

/*
* The item's name string, if this item is the child of,
Expand All @@ -65,141 +72,33 @@ typedef struct cJSON {
char *string;
} cJSON;

typedef struct cJSON_Hooks {
void *(*malloc_fn)(size_t sz);
void (*free_fn)(void *ptr);
} cJSON_Hooks;

/* Supply malloc, realloc and free functions to cJSON */
extern void cJSON_InitHooks(cJSON_Hooks* hooks);

/*
* Supply a block of JSON, and this returns a cJSON object you can interrogate.
* Call cJSON_Delete when finished.
*/
extern cJSON *cJSON_Parse(const char *value);
/*
* Render a cJSON entity to text for transfer/storage.
* Free the char* when finished.
*/
extern char *cJSON_Print(cJSON *item);
/*
* Render a cJSON entity to text for transfer/storage without any formatting.
* Free the char* when finished.
*/
extern char *cJSON_PrintUnformatted(cJSON *item);
/*
* Render a cJSON entity to text using a buffered strategy.
* prebuffer is a guess at the final size. guessing well reduces reallocation.
* fmt=0 gives unformatted, =1 gives formatted
*/
extern char *cJSON_PrintBuffered(cJSON *item, int prebuffer, int fmt);
cJSON *cJSON_Parse(const char *value);
/* Delete a cJSON entity and all subentities. */
extern void cJSON_Delete(cJSON *c);
void cJSON_Delete(cJSON *c);

/* Returns the number of items in an array (or object). */
extern int cJSON_GetArraySize(cJSON *array);
/*
* Retrieve item number "item" from array "array". Returns NULL if unsuccessful.
*/
extern cJSON *cJSON_GetArrayItem(cJSON *array, int item);
int cJSON_GetArraySize(cJSON *array);
/* Returns item number "item" from array "array". NULL if unsuccessful. */
cJSON *cJSON_GetArrayItem(cJSON *array, int item);
/* Get item "string" from object. Case insensitive. */
extern cJSON *cJSON_GetObjectItem(cJSON *object, const char *string);
cJSON *cJSON_GetObjectItem(cJSON *object, const char *string);

/*
* For analysing failed parses. This returns a pointer to the parse error.
* You'll probably need to look a few chars back to make sense of it.
* Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds.
*/
extern const char *cJSON_GetErrorPtr(void);

/* These calls create a cJSON item of the appropriate type. */
extern cJSON *cJSON_CreateNull(void);
extern cJSON *cJSON_CreateTrue(void);
extern cJSON *cJSON_CreateFalse(void);
extern cJSON *cJSON_CreateBool(int b);
extern cJSON *cJSON_CreateNumber(double num);
extern cJSON *cJSON_CreateString(const char *string);
extern cJSON *cJSON_CreateArray(void);
extern cJSON *cJSON_CreateObject(void);

/* These utilities create an Array of count items. */
extern cJSON *cJSON_CreateIntArray(const int *numbers, int count);
extern cJSON *cJSON_CreateFloatArray(const float *numbers, int count);
extern cJSON *cJSON_CreateDoubleArray(const double *numbers, int count);
extern cJSON *cJSON_CreateStringArray(const char **strings, int count);

/* Append item to the specified array/object. */
extern void cJSON_AddItemToArray(cJSON *array, cJSON *item);
extern void cJSON_AddItemToObject(cJSON *object, const char *string,
cJSON *item);
/*
* Use this when string is definitely const (i.e. a literal, or as good as),
* and will definitely survive the cJSON object
*/
extern void cJSON_AddItemToObjectCS(cJSON *object, const char *string,
cJSON *item);
/*
* Append reference to item to the specified array/object.
* Use this when you want to add an existing cJSON to a new cJSON,
* but don't want to corrupt your existing cJSON.
*/
extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
extern void cJSON_AddItemReferenceToObject(cJSON *object, const char *string,
cJSON *item);

/* Remove/Detatch items from Arrays/Objects. */
extern cJSON *cJSON_DetachItemFromArray(cJSON *array, int which);
extern void cJSON_DeleteItemFromArray(cJSON *array, int which);
extern cJSON *cJSON_DetachItemFromObject(cJSON *object, const char *string);
extern void cJSON_DeleteItemFromObject(cJSON *object, const char *string);

/* Update array items. */
/* Shifts pre-existing items to the right. */
extern void cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem);
extern void cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
extern void cJSON_ReplaceItemInObject(cJSON *object, const char *string,
cJSON *newitem);

/* Duplicate a cJSON item */
extern cJSON *cJSON_Duplicate(cJSON *item, int recurse);
/*
* Duplicate will create a new, identical cJSON item to the one you pass,
* in new memory that will need to be released. With recurse!=0, it will
* duplicate any children connected to the item.
* The item->next and ->prev pointers are always zero on return from Duplicate.
*/
const char *cJSON_GetErrorPtr(void);

/*
* ParseWithOpts allows you to require (and check) that the JSON is
* null-terminated, and to retrieve the pointer to the final byte parsed.
*/
extern cJSON *cJSON_ParseWithOpts(const char *value,
cJSON *cJSON_ParseWithOpts(const char *value,
const char **return_parse_end, int require_null_terminated);

extern void cJSON_Minify(char *json);

/* Macros for creating things quickly. */
#define cJSON_AddNullToObject(object,name) \
cJSON_AddItemToObject(object, name, cJSON_CreateNull())
#define cJSON_AddTrueToObject(object,name) \
cJSON_AddItemToObject(object, name, cJSON_CreateTrue())
#define cJSON_AddFalseToObject(object,name) \
cJSON_AddItemToObject(object, name, cJSON_CreateFalse())
#define cJSON_AddBoolToObject(object,name,b) \
cJSON_AddItemToObject(object, name, cJSON_CreateBool(b))
#define cJSON_AddNumberToObject(object,name,n) \
cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))
#define cJSON_AddStringToObject(object,name,s) \
cJSON_AddItemToObject(object, name, cJSON_CreateString(s))

/*
* When assigning an integer value, it needs to be propagated to valuedouble
* too.
*/
#define cJSON_SetIntValue(object,val) \
((object) ? (object)->valueint=(object)->valuedouble=(val) : (val))
#define cJSON_SetNumberValue(object,val) \
((object) ? (object)->valueint=(object)->valuedouble=(val) : (val))

#endif

0 comments on commit 1d44974

Please sign in to comment.