From f31b34d0f0efefda0e2b2f20e29a9f94273580c1 Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 21 Oct 2026 16:18:51 +0200 Subject: [PATCH] Clarify serialization limits, cleanup and error codes --- lib/serialize.h | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/serialize.h b/lib/serialize.h index b698bba2..5d2c8788 100644 --- a/lib/serialize.h +++ b/lib/serialize.h @@ -24,10 +24,12 @@ * • Для linked list в буфере сохраняется только количество узлов + сырые данные узлов * (включая байты next/padding; decode заменяет next восстановленными ссылками). * • serialize_decode принимает буфер БЕЗ заголовка. - * • serialize_free освобождает ВСЮ структуру и все вложенные динамические объекты. + * • serialize_free освобождает структуру, динамические поля схемы и узлы списков; обнуляет указатель на структуру. + * Указатели внутри элементов массивов и узлов списков рекурсивно не освобождаются. * • Поля кодируются в порядке schema.fields; фиксированные данные копируются без смены endian. * • max_size (если > 0) — лимит encode; header при header_len > 0 обязателен. - * • Переменные counts ограничены 65535; elem_size=1 добавляет NUL и для byte-массивов. + * • При encode counts больше 65535 молча усекаются: сохраняются первые 65535 элементов массива/списка или байтов строки. + * • elem_size=1 добавляет NUL и для byte-массивов. * • Linked nodes копируются целиком, без рекурсивного кодирования вложенных указателей. * • Этот формат зависит от ABI сырых полей; сериализация не нормализует размер/выравнивание структур. * @@ -103,7 +105,7 @@ struct SerializeField { uint16_t offset; ///< смещение поля в структуре uint8_t elem_size; ///< размер элемента (для fixed = размер данных, для array/linked = размер одного элемента) uint8_t type; ///< SERIALIZE_TYPE_* - uint16_t len_offset; ///< смещение поля-счётчика (игнорируется для type 0,1,2) + uint16_t len_offset; ///< type 3–5: смещение счётчика в структуре; type 6: смещение next в узле; type 0–2: игнорируется }; /** @@ -118,10 +120,10 @@ struct SerializeSchema { }; #define SERIALIZE_ERR_OK 0 ///< успех -#define SERIALIZE_ERR_BUF -1 ///< ошибка выделения памяти +#define SERIALIZE_ERR_BUF -1 ///< нехватка памяти; decode также: обрезанные данные или неизвестный тип поля #define SERIALIZE_ERR_NULL -2 ///< NULL-указатель -#define SERIALIZE_ERR_SIZE -3 ///< превышен max_size -#define SERIALIZE_ERR_NOTSUP -4 ///< неподдерживаемый тип +#define SERIALIZE_ERR_SIZE -3 ///< encode: превышен max_size +#define SERIALIZE_ERR_NOTSUP -4 ///< encode: неподдерживаемый тип поля int serialize_encode(const void* structure, const struct SerializeSchema* schema,