summaryrefslogtreecommitdiff
path: root/src/domain/message.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/domain/message.c')
-rw-r--r--src/domain/message.c49
1 files changed, 40 insertions, 9 deletions
diff --git a/src/domain/message.c b/src/domain/message.c
index d973be4..b1db3e1 100644
--- a/src/domain/message.c
+++ b/src/domain/message.c
@@ -3,6 +3,8 @@
#include <stdlib.h>
#include <string.h>
+#include "base/allocator.h"
+
static char *
duplicate_string(const char *value)
{
@@ -15,9 +17,20 @@ duplicate_string(const char *value)
return copy;
}
+static int
+copy_failed(tiny_message_t *message)
+{
+ tiny_message_free(message);
+ return -1;
+}
+
void
tiny_message_init(tiny_message_t *message)
{
+ if (message == NULL)
+ {
+ return;
+ }
memset(message, 0, sizeof(*message));
message->metadata.memory_tier = TINY_TIER_SHORT;
}
@@ -26,6 +39,10 @@ void
tiny_message_free(tiny_message_t *message)
{
size_t index;
+ if (message == NULL)
+ {
+ return;
+ }
free(message->session_id);
free(message->content);
free(message->metadata.tool_call_id);
@@ -41,6 +58,12 @@ int
tiny_message_copy(tiny_message_t *destination, const tiny_message_t *source)
{
size_t index;
+ if (destination == NULL || source == NULL || destination == source || source->session_id == NULL
+ || source->content == NULL
+ || (source->metadata.tag_count != 0 && source->metadata.tags == NULL))
+ {
+ return -1;
+ }
tiny_message_init(destination);
memcpy(destination->message_id, source->message_id, sizeof(destination->message_id));
destination->timestamp_ms = source->timestamp_ms;
@@ -50,14 +73,14 @@ tiny_message_copy(tiny_message_t *destination, const tiny_message_t *source)
destination->content = duplicate_string(source->content);
if (destination->session_id == NULL || destination->content == NULL)
{
- goto failure;
+ return copy_failed(destination);
}
if (source->metadata.tool_call_id != NULL)
{
destination->metadata.tool_call_id = duplicate_string(source->metadata.tool_call_id);
if (destination->metadata.tool_call_id == NULL)
{
- goto failure;
+ return copy_failed(destination);
}
}
if (source->metadata.tag_count > 0)
@@ -65,23 +88,19 @@ tiny_message_copy(tiny_message_t *destination, const tiny_message_t *source)
destination->metadata.tags = calloc(source->metadata.tag_count, sizeof(char *));
if (destination->metadata.tags == NULL)
{
- goto failure;
+ return copy_failed(destination);
}
for (index = 0; index < source->metadata.tag_count; ++index)
{
destination->metadata.tags[index] = duplicate_string(source->metadata.tags[index]);
if (destination->metadata.tags[index] == NULL)
{
- goto failure;
+ return copy_failed(destination);
}
destination->metadata.tag_count++;
}
}
return 0;
-
-failure:
- tiny_message_free(destination);
- return -1;
}
const char *
@@ -103,6 +122,10 @@ tiny_role_name(tiny_role_t role)
bool
tiny_role_parse(const char *value, tiny_role_t *role)
{
+ if (value == NULL || role == NULL)
+ {
+ return false;
+ }
if (strcmp(value, "user") == 0)
{
*role = TINY_ROLE_USER;
@@ -143,6 +166,10 @@ tiny_tier_name(tiny_memory_tier_t tier)
bool
tiny_tier_parse(const char *value, tiny_memory_tier_t *tier)
{
+ if (value == NULL || tier == NULL)
+ {
+ return false;
+ }
if (strcmp(value, "short") == 0)
{
*tier = TINY_TIER_SHORT;
@@ -170,6 +197,10 @@ bool
tiny_utf8_valid(const char *value, size_t length)
{
size_t index = 0;
+ if (value == NULL)
+ {
+ return length == 0;
+ }
while (index < length)
{
const unsigned char first = (unsigned char)value[index++];
@@ -240,7 +271,7 @@ tiny_message_id_valid(const char *value)
{
static const char alphabet[] = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
size_t index;
- if (strlen(value) != TINY_MESSAGE_ID_LENGTH || value[0] > '7')
+ if (value == NULL || strlen(value) != TINY_MESSAGE_ID_LENGTH || value[0] > '7')
{
return false;
}