]> git.ipfire.org Git - thirdparty/ulogd2.git/commitdiff
db, IP2BIN: correct `format_ipv6()` output buffer sizes
authorJeremy Sowden <jeremy@azazel.net>
Mon, 26 May 2025 17:19:01 +0000 (18:19 +0100)
committerFlorian Westphal <fw@strlen.de>
Sun, 1 Jun 2025 12:12:47 +0000 (14:12 +0200)
`format_ipv6()` formats IPv6 addresses as hex-strings.  However, sizing for the
output buffer is not done quite right.

The elements of the `ipbin_array` array in ulogd_filter_IP2BIN.c are sized using
a local macro, `IPADDR_LENGTH`, which is defined as 128, the number of bits in
an IPv6 address; this is much larger than necessary.

Define an appropriate macro and use that instead.

Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
Signed-off-by: Florian Westphal <fw@strlen.de>
filter/ulogd_filter_IP2BIN.c
include/ulogd/ulogd.h
util/db.c

index 7f7bea5071a7c1b11c693e68dc5dead2dc66a3fc..f1ca4eee7d76a134ddd7d488180b783d31af15fb 100644 (file)
@@ -28,8 +28,6 @@
 #include <ulogd/ulogd.h>
 #include <netinet/if_ether.h>
 
-#define IPADDR_LENGTH 128
-
 enum input_keys {
        KEY_OOB_FAMILY,
        KEY_OOB_PROTOCOL,
@@ -114,7 +112,7 @@ static struct ulogd_key ip2bin_keys[] = {
 
 };
 
-static char ipbin_array[MAX_KEY - START_KEY + 1][IPADDR_LENGTH];
+static char ipbin_array[MAX_KEY - START_KEY + 1][FORMAT_IPV6_BUFSZ];
 
 static int ip2bin(struct ulogd_key *inp, int index, int oindex)
 {
@@ -161,7 +159,7 @@ static int ip2bin(struct ulogd_key *inp, int index, int oindex)
                        return ULOGD_IRET_ERR;
        }
 
-       format_ipv6(ipbin_array[oindex], IPADDR_LENGTH, addr);
+       format_ipv6(ipbin_array[oindex], sizeof(ipbin_array[oindex]), addr);
 
        return ULOGD_IRET_OK;
 }
index 5eafb21f9cfe5b0b45763651e112f5399906450a..29082dfbe1b2be303c658e31a4efae96a1d51076 100644 (file)
 
 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
 
+/*
+ * Minimum size of buffer required to hold an ipv6 address encoded as a
+ * hex-string, e.g.:
+ *
+ *                          ::1 -> "0x00000000000000000000000000000001"
+ * 2600:1408:ec00:36::1736:7f28 -> "0x26001408ec0000360000000017367f28"
+ */
+#define FORMAT_IPV6_BUFSZ (2 + sizeof(struct in6_addr) * 2 + 1)
+
 /* All types with MSB = 1 make use of value.ptr
  * other types use one of the union's member */
 
@@ -233,7 +242,7 @@ format_ipv6(char *buf, size_t size, const struct in6_addr *ipv6)
 {
        unsigned i = 0;
 
-       if (size > 2 + sizeof (*ipv6) * 2) {
+       if (size >= FORMAT_IPV6_BUFSZ) {
                buf[i++] = '0';
                buf[i++] = 'x';
 
index 11c3e6ad8454a30b47b89f86872145200ee86744..69f4290f5c87483d68d08cc35c0006cd242afdd4 100644 (file)
--- a/util/db.c
+++ b/util/db.c
@@ -370,7 +370,7 @@ static void __format_query_db(struct ulogd_pluginstance *upi, char *start)
                                sprintf(stmt_ins, "%u,", res->u.value.ui32);
                        else {
                                struct in6_addr ipv6;
-                               char addrbuf[2 + sizeof(ipv6) * 2  + 1];
+                               char addrbuf[FORMAT_IPV6_BUFSZ];
 
                                memcpy(ipv6.s6_addr, res->u.value.ui128,
                                       sizeof(ipv6.s6_addr));