mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
sysfs: make sure read buffer is zeroed
13c589d5b0
("sysfs: use seq_file when reading regular files") switched sysfs from custom read implementation to seq_file to enable later transition to kernfs. After the change, the buffer passed to ->show() is acquired through seq_get_buf(); unfortunately, this introduces a subtle behavior change. Before the commit, the buffer passed to ->show() was always zero as it was allocated using get_zeroed_page(). Because seq_file doesn't clear buffers on allocation and neither does seq_get_buf(), after the commit, depending on the behavior of ->show(), we may end up exposing uninitialized data to userland thus possibly altering userland visible behavior and leaking information. Fix it by explicitly clearing the buffer. Signed-off-by: Tejun Heo <tj@kernel.org> Reported-by: Ron <ron@debian.org> Fixes:13c589d5b0
("sysfs: use seq_file when reading regular files") Cc: stable <stable@vger.kernel.org> # 3.13+ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
555724a831
commit
f5c16f29bf
@ -47,12 +47,13 @@ static int sysfs_kf_seq_show(struct seq_file *sf, void *v)
|
||||
ssize_t count;
|
||||
char *buf;
|
||||
|
||||
/* acquire buffer and ensure that it's >= PAGE_SIZE */
|
||||
/* acquire buffer and ensure that it's >= PAGE_SIZE and clear */
|
||||
count = seq_get_buf(sf, &buf);
|
||||
if (count < PAGE_SIZE) {
|
||||
seq_commit(sf, -1);
|
||||
return 0;
|
||||
}
|
||||
memset(buf, 0, PAGE_SIZE);
|
||||
|
||||
/*
|
||||
* Invoke show(). Control may reach here via seq file lseek even
|
||||
|
Loading…
Reference in New Issue
Block a user