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:
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);