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:
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;
}