From 72d35fc4910a45f0c3e162e605cf9014234485c8 Mon Sep 17 00:00:00 2001 From: James Prestwood Date: Thu, 13 Oct 2022 13:02:40 -0700 Subject: [PATCH] monitor: use int64_t type for NLMSG_NEXT length Commit c7640f8346 was meant to fix a sign compare warning in clang because NLMSG_NEXT internally compares the length with nlmsghdr->nlmsg_len which is a u32. The problem is the NLMSG_NEXT can underflow an unsigned value, hence why it expects an int type to be passed in. To work around this we can instead pass a larger sized int64_t which the compiler allows since it can upgrade the unsigned nlmsghdr->nlmsg_len. There is no underflow risk with an int64_t either because the buffer used is much smaller than what can fit in an int64_t. Fixes: c7640f8346 ("monitor: fix integer comparison error (clang)") --- monitor/main.c | 2 +- monitor/nlmon.c | 6 +++--- monitor/nlmon.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/monitor/main.c b/monitor/main.c index 9117fba3..f0b16bbf 100644 --- a/monitor/main.c +++ b/monitor/main.c @@ -451,7 +451,7 @@ static int analyze_pcap(const char *pathname) while (pcap_read(pcap, &tv, buf, snaplen, &len, &real_len)) { struct nlmsghdr *nlmsg; - uint32_t aligned_len; + int64_t aligned_len; uint16_t arphrd_type; uint16_t proto_type; diff --git a/monitor/nlmon.c b/monitor/nlmon.c index 2222db09..69e86ce3 100644 --- a/monitor/nlmon.c +++ b/monitor/nlmon.c @@ -8080,7 +8080,7 @@ static void print_rtnl_msg(const struct timeval *tv, void nlmon_print_rtnl(struct nlmon *nlmon, const struct timeval *tv, const void *data, uint32_t size) { - uint32_t aligned_size = NLMSG_ALIGN(size); + int64_t aligned_size = NLMSG_ALIGN(size); const struct nlmsghdr *nlmsg; update_time_offset(tv); @@ -8112,7 +8112,7 @@ void nlmon_print_rtnl(struct nlmon *nlmon, const struct timeval *tv, } void nlmon_print_genl(struct nlmon *nlmon, const struct timeval *tv, - const void *data, uint32_t size) + const void *data, int64_t size) { const struct nlmsghdr *nlmsg; @@ -8144,7 +8144,7 @@ static bool nlmon_receive(struct l_io *io, void *user_data) unsigned char buf[8192]; unsigned char control[32]; ssize_t bytes_read; - uint32_t nlmsg_len; + int64_t nlmsg_len; int fd; fd = l_io_get_fd(io); diff --git a/monitor/nlmon.h b/monitor/nlmon.h index f2f2892a..ab038fdf 100644 --- a/monitor/nlmon.h +++ b/monitor/nlmon.h @@ -41,7 +41,7 @@ void nlmon_destroy(struct nlmon *nlmon); void nlmon_print_rtnl(struct nlmon *nlmon, const struct timeval *tv, const void *data, uint32_t size); void nlmon_print_genl(struct nlmon *nlmon, const struct timeval *tv, - const void *data, uint32_t size); + const void *data, int64_t size); void nlmon_print_pae(struct nlmon *nlmon, const struct timeval *tv, uint8_t type, int index, const void *data, uint32_t size);