the format string of printf to print audit status is wrong
Hello Steve,
all audit status's type is __u32, so '%u' should be used
in format string of printf rather than '%d', otherwise the value outputted to user will be wraparound.
For example:
# auditctl -r 4294967295 AUDIT_STATUS: enabled=1 flag=1 pid=8999 rate_limit=-1 backlog_limit=320 lost=2241 backlog=0
but it should be
# auditctl -r 4294967295 AUDIT_STATUS: enabled=1 flag=1 pid=8999 rate_limit=4294967295 backlog_limit=320 lost=2270 backlog=0
This is the patch. Can you apply it?
--- src/auditctl.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
src/auditctl.c +2 -2
@@ -1349,8 +1349,8 @@ static int audit_print_reply(struct audit_reply *rep) printed =1 ;return 0 ;case AUDIT_GET : - printf("AUDIT_STATUS: enabled=%d flag=%d pid=%d" - " rate_limit=%d backlog_limit=%d lost=%d backlog=%d\n", + printf("AUDIT_STATUS: enabled=%u flag=%u pid=%u" + " rate_limit=%u backlog_limit=%u lost=%u backlog=%u\n", rep->status->enabled, rep->status->failure, rep->status->pid, rep->status->rate_limit, rep->status->backlog_limit, rep->status->lost,
Quoted 29 lines · Yu Zhiguo
Hello Steve,
all audit status's type is
__u32, so '%u' should be used
in format string of printf rather than '%d', otherwise the value outputted to user will be wraparound.For example:
# auditctl -r 4294967295 AUDIT_STATUS: enabled=1 flag=1 pid=8999 rate_limit=-1 backlog_limit=320 lost=2241 backlog=0but it should be
# auditctl -r 4294967295 AUDIT_STATUS: enabled=1 flag=1 pid=8999 rate_limit=4294967295 backlog_limit=320 lost=2270 backlog=0This is the patch. Can you apply it?
Signed-off-by Yu Zhiguo<[email protected]>--- src/auditctl.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)src/auditctl.c +0
-0
src/auditctl.c static int audit_print_reply(struct audit_reply *rep) · line 1353
Quoted 7 lines
src/auditctl.c +2
-2@@ -1349,8 +1349,8 @@ static int audit_print_reply(struct audit_reply *rep) printed =1 ;return 0 ;case AUDIT_GET : - printf("AUDIT_STATUS: enabled=%d flag=%d pid=%d" - " rate_limit=%d backlog_limit=%d lost=%d backlog=%d\n", + printf("AUDIT_STATUS: enabled=%u flag=%u pid=%u" + " rate_limit=%u backlog_limit=%u lost=%u backlog=%u\n",
In kernel the types are:
int audit_enabled; static int audit_failure = AUDIT_FAIL_PRINTK; typedef int __kernel_pid_t; static int audit_rate_limit; static int audit_backlog_limit = 64;
static atomic_t audit_lost = ATOMIC_INIT(0); (atomic_t is just volatile int)
backlog comes from:
static inline __u32 skb_queue_len()
So it seems reasonable to switch backlog=%d to backlog=%u but all of the other values "could" be negative and should be shown as ints.
-Eric
Hello Eric,
CC Steve,
Quoted 3 lines · Eric Paris
So it seems reasonable to switch backlog=%d to backlog=%u but all of the other values "could" be negative and should be shown as ints.
Thanks for your kindness remind.
I also think all of the other values "could" be negative and should
be shown as ints.
A new patch for auditctl:
--- src/auditctl.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
src/auditctl.c +1 -1
@@ -1350,7 +1350,7 @@ static int audit_print_reply(struct audit_reply *rep)return 0 ;case AUDIT_GET : printf("AUDIT_STATUS: enabled=%d flag=%d pid=%d" - " rate_limit=%d backlog_limit=%d lost=%d backlog=%d\n", + " rate_limit=%d backlog_limit=%d lost=%d backlog=%u\n", rep->status->enabled, rep->status->failure, rep->status->pid, rep->status->rate_limit, rep->status->backlog_limit, rep->status->lost,
Quoted 2 lines · On Thursday 31 July 2008 09:07:30 Eric Paris wrote:
So it seems reasonable to switch backlog=%d to backlog=%u but all of the other values "could" be negative and should be shown as ints.
Good point. I updated the patch.
-Steve
Steve Grubb
AppliedQuoted 5 lines · On Thursday 31 July 2008 01:07:48 Yu Zhiguo wrote:
all audit status's type is
__u32, so '%u' should be used in format string of printf rather than '%d', otherwise the value outputted to user will be wraparound.This is the patch. Can you apply it?
Applied. Thanks!
-Steve