Just a few minor proposed updates. Only the last one will actually affect behavior. The rest are just misleading code. Several AUDIT_SET functions return 'old' value, but only return value <0 is checked for. So just return 0. propagate audit_set_rate_limit and audit_set_backlog_limit error values In audit_buffer_free, the audit_freelist_count was being incremented even when we discard the return buffer, so audit_freelist_count can end up wrong. This could cause the actual freelist to shrink over time, eventually threatening to degrate audit performance.
Showing the changes to kernel (1 of 1 file). Show all
Unified · Split
| @@ -251,7 +251,7 @@ static int audit_set_rate_limit(int limit, uid_t loginuid, u32 sid) · 250 unmodified lines | ||
| 251 | 251 | "audit_rate_limit=%d old=%d by auid=%u", |
| 252 | 252 | limit, old, loginuid); |
| 253 | 253 | audit_rate_limit = limit; |
| 254 | − return old; | |
| 254 | + return 0; | |
| 255 | 255 | } |
| 256 | 256 | |
| 257 | 257 | static int audit_set_backlog_limit(int limit, uid_t loginuid, u32 sid) |
| @@ -274,7 +274,7 @@ static int audit_set_backlog_limit(int limit, uid_t loginuid, u32 sid) · 16 unmodified lines | ||
| 274 | 274 | "audit_backlog_limit=%d old=%d by auid=%u", |
| 275 | 275 | limit, old, loginuid); |
| 276 | 276 | audit_backlog_limit = limit; |
| 277 | − return old; | |
| 277 | + return 0; | |
| 278 | 278 | } |
| 279 | 279 | |
| 280 | 280 | static int audit_set_enabled(int state, uid_t loginuid, u32 sid) |
| @@ -300,7 +300,7 @@ static int audit_set_enabled(int state, uid_t loginuid, u32 sid) · 19 unmodified lines | ||
| 300 | 300 | "audit_enabled=%d old=%d by auid=%u", |
| 301 | 301 | state, old, loginuid); |
| 302 | 302 | audit_enabled = state; |
| 303 | − return old; | |
| 303 | + return 0; | |
| 304 | 304 | } |
| 305 | 305 | |
| 306 | 306 | static int audit_set_failure(int state, uid_t loginuid, u32 sid) |
| @@ -328,7 +328,7 @@ static int audit_set_failure(int state, uid_t loginuid, u32 sid) · 21 unmodified lines | ||
| 328 | 328 | "audit_failure=%d old=%d by auid=%u", |
| 329 | 329 | state, old, loginuid); |
| 330 | 330 | audit_failure = state; |
| 331 | − return old; | |
| 331 | + return 0; | |
| 332 | 332 | } |
| 333 | 333 | |
| 334 | 334 | static int kauditd_thread(void *dummy) |
| @@ -364,7 +364,6 @@ static int kauditd_thread(void *dummy) · 29 unmodified lines | ||
| 364 | 364 | remove_wait_queue(&kauditd_wait, &wait); |
| 365 | 365 | } |
| 366 | 366 | } |
| 367 | − return 0; | |
| 368 | 367 | } |
| 369 | 368 | |
| 370 | 369 | int audit_send_list(void *_dest) |
| @@ -551,10 +550,10 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh) · 180 unmodified lines | ||
| 551 | 550 | audit_pid = status_get->pid; |
| 552 | 551 | } |
| 553 | 552 | if (status_get->mask & AUDIT_STATUS_RATE_LIMIT) |
| 554 | − audit_set_rate_limit(status_get->rate_limit, | |
| 553 | + err = audit_set_rate_limit(status_get->rate_limit, | |
| 555 | 554 | loginuid, sid); |
| 556 | 555 | if (status_get->mask & AUDIT_STATUS_BACKLOG_LIMIT) |
| 557 | − audit_set_backlog_limit(status_get->backlog_limit, | |
| 556 | + err = audit_set_backlog_limit(status_get->backlog_limit, | |
| 558 | 557 | loginuid, sid); |
| 559 | 558 | break; |
| 560 | 559 | case AUDIT_USER: |
| @@ -727,10 +726,12 @@ static void audit_buffer_free(struct audit_buffer *ab) · 166 unmodified lines | ||
| 727 | 726 | kfree_skb(ab->skb); |
| 728 | 727 | |
| 729 | 728 | spin_lock_irqsave(&audit_freelist_lock, flags); |
| 730 | − if (++audit_freelist_count > AUDIT_MAXFREE) | |
| 729 | + if (audit_freelist_count > AUDIT_MAXFREE) | |
| 731 | 730 | kfree(ab); |
| 732 | − else | |
| 731 | + else { | |
| 732 | + audit_freelist_count++; | |
| 733 | 733 | list_add(&ab->list, &audit_freelist); |
| 734 | + } | |
| 734 | 735 | spin_unlock_irqrestore(&audit_freelist_lock, flags); |
| 735 | 736 | } |
| 736 | 737 | |