ci: fix clang sanitize errors for json_decode
parent
11ccf06441
commit
2ecfd1b351
|
@ -74,6 +74,11 @@ typedef struct {
|
||||||
} error;
|
} error;
|
||||||
static error global_error = { NULL, 0 };
|
static error global_error = { NULL, 0 };
|
||||||
|
|
||||||
|
CJSON_PUBLIC(size_t) cJSON_GetErrorPos(void)
|
||||||
|
{
|
||||||
|
return global_error.position;
|
||||||
|
}
|
||||||
|
|
||||||
CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void)
|
CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void)
|
||||||
{
|
{
|
||||||
return (const char*) (global_error.json + global_error.position);
|
return (const char*) (global_error.json + global_error.position);
|
||||||
|
|
|
@ -172,6 +172,7 @@ CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const objec
|
||||||
CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string);
|
CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const 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. */
|
/* 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. */
|
||||||
CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void);
|
CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void);
|
||||||
|
CJSON_PUBLIC(size_t) cJSON_GetErrorPos(void);
|
||||||
|
|
||||||
/* Check if the item is a string and return its valuestring */
|
/* Check if the item is a string and return its valuestring */
|
||||||
CJSON_PUBLIC(char *) cJSON_GetStringValue(cJSON *item);
|
CJSON_PUBLIC(char *) cJSON_GetStringValue(cJSON *item);
|
||||||
|
|
|
@ -73,10 +73,13 @@ $dec_fn_dec {
|
||||||
if (!root) {
|
if (!root) {
|
||||||
const char *error_ptr = cJSON_GetErrorPtr();
|
const char *error_ptr = cJSON_GetErrorPtr();
|
||||||
if (error_ptr != NULL) {
|
if (error_ptr != NULL) {
|
||||||
char *prevline_ptr = (char*)error_ptr;
|
const size_t error_pos = cJSON_GetErrorPos();
|
||||||
int maxcontext_chars = 30;
|
int maxcontext_chars = 30;
|
||||||
|
byte *buf = vcalloc_noscan(maxcontext_chars + 10);
|
||||||
|
if(error_pos > 0) {
|
||||||
int backlines = 1;
|
int backlines = 1;
|
||||||
int backchars = maxcontext_chars-7;
|
int backchars = error_pos < maxcontext_chars-7 ? (int)error_pos : maxcontext_chars-7 ;
|
||||||
|
char *prevline_ptr = (char*)error_ptr;
|
||||||
while(backchars--){
|
while(backchars--){
|
||||||
char prevc = *(prevline_ptr - 1);
|
char prevc = *(prevline_ptr - 1);
|
||||||
if(0==prevc){
|
if(0==prevc){
|
||||||
|
@ -90,10 +93,9 @@ $dec_fn_dec {
|
||||||
break; // stop at `{` too
|
break; // stop at `{` too
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
byte *buf = _v_malloc(maxcontext_chars + 10);
|
int maxchars = vstrlen_char(prevline_ptr);
|
||||||
vmemset(buf, 0, maxcontext_chars+10);
|
vmemcpy(buf, prevline_ptr, (maxchars < maxcontext_chars ? maxchars : maxcontext_chars));
|
||||||
vmemcpy(buf, prevline_ptr, maxcontext_chars);
|
}
|
||||||
// for(int x=-10;x<10;x++){ char *xx = prevline_ptr+x; fprintf(stderr, "2 prevline_ptr + %d: %p | %c | %d \\n", x, xx, (int)(*(xx)), (int)(*(xx))); } fprintf(stderr, "--------\\n");
|
|
||||||
return (Option_$styp){.state = 2,.err = _v_error(tos2(buf)),.data = {0}};
|
return (Option_$styp){.state = 2,.err = _v_error(tos2(buf)),.data = {0}};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue