From 4bc721c3bf7589b519c5730d093f704ce56e3f09 Mon Sep 17 00:00:00 2001 From: tanaka takashi Date: Mon, 29 Jun 2026 21:43:54 +0900 Subject: refactor: MCP層をmcpc APIベースに刷新 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 独自JSON-RPC処理をmcpcへ置き換え - 各MCPツールを個別ソースへ分離 - 共通コンテキストと登録処理を整理 - mcpc互換修正と統合テストを更新 --- src/domain/message.c | 49 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 9 deletions(-) (limited to 'src/domain/message.c') 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 #include +#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; } -- cgit v1.2.3