QUOTE: Never too old to chase dreams.

libjson

A simple JSON parser

commit bb866e656e3e8350eba538397a1f845f834627b7
parent 3dae97c530b1f0eaaa1714a401d2b11b8a04d4e2
Author: Sophie <info@soophie.de>
Date:   Sun,  6 Apr 2025 12:13:54 +0000

fix: Fixed memory leaks & undefined behavior

Diffstat:
Mlibjson.h | 20+++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/libjson.h b/libjson.h @@ -41,6 +41,12 @@ json_ptr_t json_query(json_ptr_t json_ptr, const char *query); #include "libjson.h" char *json_str(json_ptr_t json_ptr) { + if (json_ptr.err != JSON_OK) { + return NULL; + } + if (json_ptr.ptr >= json_ptr.len) { + return NULL; + } jsmntok_t token = json_ptr.tokens[json_ptr.ptr]; int token_len = token.end - token.start; char *str = malloc(token_len + 1); @@ -87,7 +93,7 @@ json_ptr_t json_parse(jsmntok_t tokens[], int tokens_len, const char *str) { void json_seek(json_ptr_t *json_ptr) { jsmntok_t token_root = json_ptr->tokens[json_ptr->ptr]; if (token_root.type != JSMN_OBJECT && token_root.type != JSMN_ARRAY) { - json_err(*json_ptr, JSON_ERR_INVALID_TYPE); + json_ptr->err = JSON_ERR_INVALID_TYPE; return; } jsmntok_t token; @@ -106,6 +112,9 @@ void json_seek(json_ptr_t *json_ptr) { } json_ptr_t json_get(json_ptr_t json_ptr, const char *key) { + if (json_ptr.err != JSON_OK) { + return json_err(json_ptr, JSON_ERR_INVALID_MISSING); + } jsmntok_t token_root = json_ptr.tokens[json_ptr.ptr]; if (token_root.type != JSMN_OBJECT) { return json_err(json_ptr, JSON_ERR_INVALID_TYPE); @@ -113,6 +122,9 @@ json_ptr_t json_get(json_ptr_t json_ptr, const char *key) { jsmntok_t token; int token_len; while (json_ptr.ptr < json_ptr.len) { + if (json_ptr.ptr + 1 >= json_ptr.len) { + return json_err(json_ptr, JSON_ERR_INVALID_MISSING); + } token = json_ptr.tokens[++json_ptr.ptr]; // key token_len = token.end - token.start; char token_key[token_len + 1]; @@ -134,6 +146,9 @@ json_ptr_t json_get(json_ptr_t json_ptr, const char *key) { } json_ptr_t json_at(json_ptr_t json_ptr, int idx) { + if (json_ptr.err != JSON_OK) { + return json_err(json_ptr, JSON_ERR_INVALID_MISSING); + } jsmntok_t token_root = json_ptr.tokens[json_ptr.ptr]; if (token_root.type != JSMN_ARRAY) { return json_err(json_ptr, JSON_ERR_INVALID_TYPE); @@ -160,6 +175,9 @@ json_ptr_t json_at(json_ptr_t json_ptr, int idx) { } json_ptr_t json_query(json_ptr_t json_ptr, const char *query) { + if (json_ptr.err != JSON_OK) { + return json_err(json_ptr, JSON_ERR_INVALID_MISSING); + } jsmntok_t token_root = json_ptr.tokens[json_ptr.ptr]; if (token_root.type != JSMN_OBJECT && token_root.type != JSMN_ARRAY) { return json_err(json_ptr, JSON_ERR_INVALID_TYPE);