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)")
This commit is contained in:
James Prestwood 2022-10-13 13:02:40 -07:00 committed by Denis Kenzior
parent dc6575130e
commit 72d35fc491
3 changed files with 5 additions and 5 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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);