libqaeda

Unnamed repository; edit this file 'description' to name the repository.
Info | Log | Files | Refs | README | LICENSE

commit 730b8edd3e9dcf95a7fd9fcdbe8b95287853a524
parent 8ec365dc32eb3ec1b0d8bfd322e5a5880df62cb4
Author: lash <dev@holbrook.no>
Date:   Sat,  5 Apr 2025 02:31:17 +0100

WIP still segfaults in deserialize, crashes valgrind

Diffstat:
Msrc/cli/main.c | 3++-
Msrc/lq/base.c | 3---
Msrc/lq/cert.c | 20+++++++++++++++-----
Msrc/lq/msg.c | 43++++++++++++++++++++++++++++++++++---------
4 files changed, 51 insertions(+), 18 deletions(-)

diff --git a/src/cli/main.c b/src/cli/main.c @@ -152,11 +152,12 @@ int main(int argc, char **argv) { } lq_certificate_free(cert); - r = lq_certificate_deserialize(&cert, out, &out_len, NULL); + r = lq_certificate_deserialize(&cert, out, out_len, NULL); if (r != ERR_OK) { lq_ui_free(); return 1; } + lq_certificate_free(cert); lq_ui_free(); } diff --git a/src/lq/base.c b/src/lq/base.c @@ -5,9 +5,6 @@ char zeros[65]; int lq_init() { - char err[1024]; - int r; - lq_err_init(); return lq_config_init(); } diff --git a/src/lq/cert.c b/src/lq/cert.c @@ -216,8 +216,8 @@ int lq_certificate_serialize(LQCert *cert, char *out, size_t *out_len, LQResolve size_t c; int r; size_t mx; - char err[LQ_ERRLEN]; - char buf[LQ_BLOCKLEN]; + char err[LQ_ERRSIZE]; + char buf[LQ_BLOCKSIZE]; LQMsg *msg; LQSig *sig; asn1_node node; @@ -225,7 +225,8 @@ int lq_certificate_serialize(LQCert *cert, char *out, size_t *out_len, LQResolve mx = *out_len; *out_len = 0; - lq_set(&node, 0, sizeof(node)); + lq_zero(&node, sizeof(node)); + r = asn1_array2tree(defs_asn1_tab, &node, err); if (r != ASN1_SUCCESS) { return ERR_INIT; @@ -345,8 +346,8 @@ int lq_certificate_serialize(LQCert *cert, char *out, size_t *out_len, LQResolve int lq_certificate_deserialize(LQCert **cert, char *in, size_t in_len, LQResolve *resolve) { int r; int c; - char err[1024]; - char tmp[4096]; + char err[LQ_ERRSIZE]; + char tmp[LQ_BLOCKSIZE]; asn1_node node; asn1_node item; LQCert *p; @@ -430,6 +431,15 @@ int lq_certificate_deserialize(LQCert **cert, char *in, size_t in_len, LQResolve *cert = p; + r = asn1_delete_structure(&item); + if (r != ASN1_SUCCESS) { + debug(LLOG_WARNING, "cert", "delete cert asn item"); + } + r = asn1_delete_structure(&node); + if (r != ASN1_SUCCESS) { + return asn_except(&node, ERR_FAIL); + } + return ERR_OK; } diff --git a/src/lq/msg.c b/src/lq/msg.c @@ -215,7 +215,7 @@ int lq_msg_serialize(LQMsg *msg, char *out, size_t *out_len, LQResolve *resolve) r = asn1_delete_structure(&node); if (r != ASN1_SUCCESS) { - return asn_except(&node, ERR_FAIL); + return r; } return ERR_OK; @@ -242,25 +242,30 @@ int lq_msg_deserialize(LQMsg **msg, const char *in, size_t in_len, LQResolve *re r = asn1_create_element(node, "Qaeda.Msg", &item); if (r != ASN1_SUCCESS) { - return ERR_READ; + return asn_except(&node, ERR_READ); } r = asn1_der_decoding(&item, in, in_len, err); if (r != ASN1_SUCCESS) { - return ERR_ENCODING; + asn_except(&item, r); + return asn_except(&node, r); } c = LQ_DIGEST_LEN; r = asn1_read_value(item, "data", z, (int*)&c); if (r != ASN1_SUCCESS) { - return ERR_READ; + r = ERR_READ; + asn_except(&item, r); + asn_except(&node, r); + return r; } c = LQ_BLOCKSIZE; resolve_active = resolve; while (resolve_active != NULL) { r = resolve_active->store->get(LQ_CONTENT_MSG, resolve_active->store, z, LQ_DIGEST_LEN, tmp, &c); if (r != ERR_OK) { - return r; + asn_except(&item, r); + return asn_except(&node, r); } resolved = LQ_MSG_RESOLVED; resolve_active = resolve_active->next; @@ -271,14 +276,20 @@ int lq_msg_deserialize(LQMsg **msg, const char *in, size_t in_len, LQResolve *re c = LQ_DIGEST_LEN; } else { if (!(resolved & LQ_MSG_RESOLVED)) { - return ERR_RESOLVE; + r = ERR_RESOLVE; + asn_except(&item, r); + asn_except(&node, r); + return r; } } *msg = lq_msg_new((const char*)tmp, c); (*msg)->state = resolved; (*msg)->data = lq_alloc(c); if ((*msg)->data == NULL) { - return ERR_MEM; + r = ERR_MEM; + asn_except(&item, r); + asn_except(&node, r); + return r; } (*msg)->len = c; lq_cpy((*msg)->data, tmp, c); @@ -287,7 +298,10 @@ int lq_msg_deserialize(LQMsg **msg, const char *in, size_t in_len, LQResolve *re c = 8; r = asn1_read_value(item, "timestamp", tmp, (int*)&c); if (r != ASN1_SUCCESS) { - return ERR_READ; + r = ERR_READ; + asn_except(&item, r); + asn_except(&node, r); + return r; } if (is_le()) { flip_endian(4, (char*)tmp); @@ -299,10 +313,21 @@ int lq_msg_deserialize(LQMsg **msg, const char *in, size_t in_len, LQResolve *re c = LQ_PUBKEY_LEN; r = asn1_read_value(item, "pubkey", tmp, (int*)&c); if (r != ASN1_SUCCESS) { - return ERR_READ; + r = ERR_READ; + asn_except(&item, r); + asn_except(&node, r); + return r; } (*msg)->pubkey = lq_publickey_new(tmp); + r = asn1_delete_structure(&item); + if (r != ASN1_SUCCESS) { + debug(LLOG_WARNING, "cert", "delete msg asn item"); + } + r = asn1_delete_structure(&node); + if (r != ASN1_SUCCESS) { + return asn_except(&node, ERR_FAIL); + }; return ERR_OK; }