`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>
#include <ulogd/ulogd.h>
#include <netinet/if_ether.h>
-#define IPADDR_LENGTH 128
-
enum input_keys {
KEY_OOB_FAMILY,
KEY_OOB_PROTOCOL,
};
-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)
{
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;
}
#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 */
{
unsigned i = 0;
- if (size > 2 + sizeof (*ipv6) * 2) {
+ if (size >= FORMAT_IPV6_BUFSZ) {
buf[i++] = '0';
buf[i++] = 'x';
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));