commit 14fd772bf8b43266b6ac9c09092f94a98f44f810
parent d76bbdb931359520a32f1091d3849e3829b7dc7a
Author: lash <dev@holbrook.no>
Date: Mon, 21 Apr 2025 19:09:11 -0600
Ensure correct endian in numeric hint in envelope
Diffstat:
2 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/src/lq/envelope.c b/src/lq/envelope.c
@@ -97,6 +97,7 @@ int lq_envelope_serialize(LQEnvelope *env, LQResolve *resolve, char *out, size_t
size_t c;
int mx;
int r;
+ int hint;
char err[LQ_ERRSIZE];
char buf[LQ_BLOCKSIZE];
asn1_node item;
@@ -110,8 +111,13 @@ int lq_envelope_serialize(LQEnvelope *env, LQResolve *resolve, char *out, size_t
return ERR_READ;
}
+ hint = env->hint;
+ r = to_endian(TO_ENDIAN_BIG, sizeof(int), &hint);
+ if (r) {
+ return asn_except(&item, ERR_BYTEORDER);
+ }
c = sizeof(int);
- r = asn1_write_value(item, "Envelope.hint", &env->hint, c);
+ r = asn1_write_value(item, "Envelope.hint", &hint, c);
if (r != ASN1_SUCCESS) {
return asn_except(&item, ERR_WRITE);
}
@@ -168,6 +174,7 @@ int lq_envelope_deserialize(LQEnvelope **env, LQResolve *resolve, const char *in
char tmp[LQ_BLOCKSIZE];
char node_seq_name[32];
int hint;
+ char *p;
LQCert *cert;
asn1_node item;
@@ -181,11 +188,16 @@ int lq_envelope_deserialize(LQEnvelope **env, LQResolve *resolve, const char *in
return asn_except(&item, ERR_ENCODING);
}
+ hint = 0;
c = sizeof(int);
r = asn1_read_value(item, "hint", &hint, &c);
if (r != ASN1_SUCCESS) {
return asn_except(&item, ERR_READ);
}
+ hint <<= ((sizeof(int) - c) * 8);
+ if (is_le()) {
+ flip_endian(sizeof(int), (char*)(&hint));
+ }
c = LQ_BLOCKSIZE;
r = asn1_read_value(item, "cert", tmp, &c);
diff --git a/src/test/test_envelope.c b/src/test/test_envelope.c
@@ -33,7 +33,7 @@ START_TEST(check_envelope) {
r = lq_certificate_serialize(cert, NULL, buf, &c);
ck_assert_int_eq(r, 0);
- env = lq_envelope_new(cert, 42);
+ env = lq_envelope_new(cert, 500);
ck_assert_ptr_nonnull(env);
r = lq_envelope_attach(env, data, strlen(data) + 1);
ck_assert_int_eq(r, 0);
@@ -47,7 +47,7 @@ START_TEST(check_envelope) {
r = lq_envelope_deserialize(&env, NULL, buf, c);
ck_assert_int_eq(r, 0);
- ck_assert_int_eq(env->hint, 42);
+ ck_assert_int_eq(env->hint, 500);
lq_envelope_free(env);
}
END_TEST