Commit 6bae8ceb authored by Kuniyuki Iwashima's avatar Kuniyuki Iwashima Committed by David S. Miller

ratelimit: Fix data-races in ___ratelimit().

While reading rs->interval and rs->burst, they can be changed
concurrently via sysctl (e.g. net_ratelimit_state).  Thus, we
need to add READ_ONCE() to their readers.

Fixes: 1da177e4 ("Linux-2.6.12-rc2")
Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 61adf447
...@@ -26,10 +26,16 @@ ...@@ -26,10 +26,16 @@
*/ */
int ___ratelimit(struct ratelimit_state *rs, const char *func) int ___ratelimit(struct ratelimit_state *rs, const char *func)
{ {
/* Paired with WRITE_ONCE() in .proc_handler().
* Changing two values seperately could be inconsistent
* and some message could be lost. (See: net_ratelimit_state).
*/
int interval = READ_ONCE(rs->interval);
int burst = READ_ONCE(rs->burst);
unsigned long flags; unsigned long flags;
int ret; int ret;
if (!rs->interval) if (!interval)
return 1; return 1;
/* /*
...@@ -44,7 +50,7 @@ int ___ratelimit(struct ratelimit_state *rs, const char *func) ...@@ -44,7 +50,7 @@ int ___ratelimit(struct ratelimit_state *rs, const char *func)
if (!rs->begin) if (!rs->begin)
rs->begin = jiffies; rs->begin = jiffies;
if (time_is_before_jiffies(rs->begin + rs->interval)) { if (time_is_before_jiffies(rs->begin + interval)) {
if (rs->missed) { if (rs->missed) {
if (!(rs->flags & RATELIMIT_MSG_ON_RELEASE)) { if (!(rs->flags & RATELIMIT_MSG_ON_RELEASE)) {
printk_deferred(KERN_WARNING printk_deferred(KERN_WARNING
...@@ -56,7 +62,7 @@ int ___ratelimit(struct ratelimit_state *rs, const char *func) ...@@ -56,7 +62,7 @@ int ___ratelimit(struct ratelimit_state *rs, const char *func)
rs->begin = jiffies; rs->begin = jiffies;
rs->printed = 0; rs->printed = 0;
} }
if (rs->burst && rs->burst > rs->printed) { if (burst && burst > rs->printed) {
rs->printed++; rs->printed++;
ret = 1; ret = 1;
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment