Report:
        Looking at your example code in
        
http://people.redhat.com/rbriggs/audit-multicast-listen/audit-multicast-listen.c,
        it seems that nlmsg_len field in the received messages is supposed to
        contain the length of the header + payload, but it is always set to the
        size of the header only, i.e. 16. The example program works, because
        the printf format specifies the minimum width, not "precision", so it
        simply prints out the payload until the first zero byte. This isn't too
        much of a problem, but precludes the use of recvmmsg, iiuc?

        (gdb) p *(struct nlmsghdr*)nlh
        $14 = {nlmsg_len = 16, nlmsg_type = 1100, nlmsg_flags = 0, nlmsg_seq = 
0, nlmsg_pid = 9910}

The only time nlmsg_len would have been updated was at audit_buffer_alloc()
inside audit_log_start() and never updated after.  It should arguably be done
in audit_log_vformat(), but would be more efficient in audit_log_end().

Reported-by: Zbigniew JÄ™drzejewski-Szmek <[email protected]>
Signed-off-by: Richard Guy Briggs <[email protected]>
---
 kernel/audit.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/kernel/audit.c b/kernel/audit.c
index aa99518..ca11482 100644
--- a/kernel/audit.c
+++ b/kernel/audit.c
@@ -2035,6 +2035,7 @@ void audit_log_end(struct audit_buffer *ab)
        } else {
                struct nlmsghdr *nlh = nlmsg_hdr(ab->skb);
 
+               nlh->nlmsg_len = ab->skb->len;
                kauditd_send_multicast_skb(ab->skb);
 
                /*
@@ -2046,7 +2047,7 @@ void audit_log_end(struct audit_buffer *ab)
                 * protocol between the kaudit kernel subsystem and the auditd
                 * userspace code.
                 */
-               nlh->nlmsg_len = ab->skb->len - NLMSG_HDRLEN;
+               nlh->nlmsg_len -= NLMSG_HDRLEN;
 
                if (audit_pid) {
                        skb_queue_tail(&audit_skb_queue, ab->skb);
-- 
1.7.1

--
Linux-audit mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/linux-audit

Reply via email to