summaryrefslogtreecommitdiff
path: root/src/mcp/json.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mcp/json.c')
-rw-r--r--src/mcp/json.c61
1 files changed, 49 insertions, 12 deletions
diff --git a/src/mcp/json.c b/src/mcp/json.c
index dcef91b..62f31c9 100644
--- a/src/mcp/json.c
+++ b/src/mcp/json.c
@@ -4,11 +4,17 @@
#include <stdlib.h>
#include <string.h>
+#include "base/allocator.h"
+
static bool
reserve(tiny_json_buffer_t *buffer, size_t addition)
{
size_t needed, capacity;
char *resized;
+ if (buffer == NULL)
+ {
+ return false;
+ }
if (buffer->failed || addition > SIZE_MAX - buffer->length - 1)
{
return false;
@@ -42,11 +48,18 @@ reserve(tiny_json_buffer_t *buffer, size_t addition)
void
tiny_json_init(tiny_json_buffer_t *buffer)
{
- memset(buffer, 0, sizeof(*buffer));
+ if (buffer != NULL)
+ {
+ memset(buffer, 0, sizeof(*buffer));
+ }
}
void
tiny_json_free(tiny_json_buffer_t *buffer)
{
+ if (buffer == NULL)
+ {
+ return;
+ }
free(buffer->data);
tiny_json_init(buffer);
}
@@ -54,7 +67,7 @@ tiny_json_free(tiny_json_buffer_t *buffer)
bool
tiny_json_raw_n(tiny_json_buffer_t *buffer, const char *value, size_t length)
{
- if (!reserve(buffer, length))
+ if ((value == NULL && length != 0) || !reserve(buffer, length))
{
return false;
}
@@ -66,14 +79,14 @@ tiny_json_raw_n(tiny_json_buffer_t *buffer, const char *value, size_t length)
bool
tiny_json_raw(tiny_json_buffer_t *buffer, const char *value)
{
- return tiny_json_raw_n(buffer, value, strlen(value));
+ return value != NULL && tiny_json_raw_n(buffer, value, strlen(value));
}
bool
tiny_json_string(tiny_json_buffer_t *buffer, const char *value)
{
const unsigned char *position = (const unsigned char *)value;
- if (!tiny_json_raw(buffer, "\""))
+ if (value == NULL || !tiny_json_raw(buffer, "\""))
{
return false;
}
@@ -85,36 +98,60 @@ tiny_json_string(tiny_json_buffer_t *buffer, const char *value)
escaped[0] = '\\';
escaped[1] = (char)*position;
escaped[2] = '\0';
- tiny_json_raw(buffer, escaped);
+ if (!tiny_json_raw(buffer, escaped))
+ {
+ return false;
+ }
}
else if (*position == '\b')
{
- tiny_json_raw(buffer, "\\b");
+ if (!tiny_json_raw(buffer, "\\b"))
+ {
+ return false;
+ }
}
else if (*position == '\f')
{
- tiny_json_raw(buffer, "\\f");
+ if (!tiny_json_raw(buffer, "\\f"))
+ {
+ return false;
+ }
}
else if (*position == '\n')
{
- tiny_json_raw(buffer, "\\n");
+ if (!tiny_json_raw(buffer, "\\n"))
+ {
+ return false;
+ }
}
else if (*position == '\r')
{
- tiny_json_raw(buffer, "\\r");
+ if (!tiny_json_raw(buffer, "\\r"))
+ {
+ return false;
+ }
}
else if (*position == '\t')
{
- tiny_json_raw(buffer, "\\t");
+ if (!tiny_json_raw(buffer, "\\t"))
+ {
+ return false;
+ }
}
else if (*position < 0x20)
{
snprintf(escaped, sizeof(escaped), "\\u%04x", *position);
- tiny_json_raw(buffer, escaped);
+ if (!tiny_json_raw(buffer, escaped))
+ {
+ return false;
+ }
}
else
{
- tiny_json_raw_n(buffer, (const char *)position, 1);
+ if (!tiny_json_raw_n(buffer, (const char *)position, 1))
+ {
+ return false;
+ }
}
++position;
}