]> granicus.if.org Git - libnl/commit
nlmsg_ok comparison between signed and unsigned
authorEric Paris <eparis@redhat.com>
Thu, 3 Jan 2013 19:26:00 +0000 (14:26 -0500)
committerThomas Graf <tgraf@suug.ch>
Thu, 3 Jan 2013 23:35:18 +0000 (00:35 +0100)
commit5d53626100f3b747109d4fc05a6d4107b09df642
tree361c294cfa0ed63a37e5a157d27bbb82c1688092
parent69719322546f8550208a7ad984f704259c9091cb
nlmsg_ok comparison between signed and unsigned

The nlmsg_ok macro has a comparison between an int and a size_t
(unsigned int).  The C spec says the int is cast to unsigned int before
the comparison.  This is a problem as the audit system will send skb's
with skb->len == nlhhdr->nlmsg_len which are NOT aligned.  Thus you can
end up with remaining being negative.  So the comparison becomes

(unsigned int)(-1) >= (unsigned int)16

Which turns out to be true!  It should clearly be false.  So if we cast
the size_t to an int we get a signed comparison and it works.  (This is
what linux/netlink.h and all of the kernel netlink headers do)

Signed-off-by: Eric Paris <eparis@redhat.com>
Signed-off-by: Thomas Graf <tgraf@suug.ch>
lib/msg.c