diff options
| author | Jin Qian <jinqian@google.com> | 2017-08-08 12:02:13 -0700 |
|---|---|---|
| committer | Moyster <oysterized@gmail.com> | 2017-08-12 15:26:28 +0200 |
| commit | e0515277369755758258197cae70ed47ffbb76d5 (patch) | |
| tree | 41d3e380d71f835497941277c5068a8130059f02 /drivers/misc | |
| parent | 98393137fdfdbe9825115be2f4f071f6587024ab (diff) | |
uid_sys_stats: fix overflow when io usage delta is negative
Setuid can cause negative delta. Check this and update total usage only
if delta is positive.
Bug: 64317562
Change-Id: I4818c246db66cabf3b11d277faceedec1678694a
Signed-off-by: Jin Qian <jinqian@google.com>
Diffstat (limited to 'drivers/misc')
| -rw-r--r-- | drivers/misc/uid_sys_stats.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/drivers/misc/uid_sys_stats.c b/drivers/misc/uid_sys_stats.c index a156de2af..9e7d39d64 100644 --- a/drivers/misc/uid_sys_stats.c +++ b/drivers/misc/uid_sys_stats.c @@ -262,13 +262,29 @@ static void compute_uid_io_bucket_stats(struct io_stats *io_bucket, struct io_stats *io_last, struct io_stats *io_dead) { - io_bucket->read_bytes += io_curr->read_bytes + io_dead->read_bytes - + s64 delta; + + delta = io_curr->read_bytes + io_dead->read_bytes - io_last->read_bytes; - io_bucket->write_bytes += io_curr->write_bytes + io_dead->write_bytes - + if (delta > 0) + io_bucket->read_bytes += delta; + + delta = io_curr->write_bytes + io_dead->write_bytes - io_last->write_bytes; - io_bucket->rchar += io_curr->rchar + io_dead->rchar - io_last->rchar; - io_bucket->wchar += io_curr->wchar + io_dead->wchar - io_last->wchar; - io_bucket->fsync += io_curr->fsync + io_dead->fsync - io_last->fsync; + if (delta > 0) + io_bucket->write_bytes += delta; + + delta = io_curr->rchar + io_dead->rchar - io_last->rchar; + if (delta > 0) + io_bucket->rchar += delta; + + delta = io_curr->wchar + io_dead->wchar - io_last->wchar; + if (delta > 0) + io_bucket->wchar += delta; + + delta = io_curr->fsync + io_dead->fsync - io_last->fsync; + if (delta > 0) + io_bucket->fsync += delta; io_last->read_bytes = io_curr->read_bytes; io_last->write_bytes = io_curr->write_bytes; |
