fs/select.c: fix information leak to userspace
authorVasiliy Kulikov <[email protected]>
Thu, 13 Jan 2011 01:00:00 +0000 (17:00 -0800)
committerLinus Torvalds <[email protected]>
Thu, 13 Jan 2011 16:03:12 +0000 (08:03 -0800)
On some architectures __kernel_suseconds_t is int.  On these archs struct
timeval has padding bytes at the end.  This struct is copied to userspace
with these padding bytes uninitialized.  This leads to leaking of contents
of kernel stack memory.

This bug was added with v2.6.27-rc5-286-gb773ad4.

[[email protected]: avoid the memset on architectures which don't need it]
Signed-off-by: Vasiliy Kulikov <[email protected]>
Cc: Al Viro <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
fs/select.c

index b7b10aa308616dea7deee300902799b12fa6541f..e56560d2b08a8db433f890f7a8baa344f50a3df1 100644 (file)
@@ -306,6 +306,8 @@ static int poll_select_copy_remaining(struct timespec *end_time, void __user *p,
                rts.tv_sec = rts.tv_nsec = 0;
 
        if (timeval) {
+               if (sizeof(rtv) > sizeof(rtv.tv_sec) + sizeof(rtv.tv_usec))
+                       memset(&rtv, 0, sizeof(rtv));
                rtv.tv_sec = rts.tv_sec;
                rtv.tv_usec = rts.tv_nsec / NSEC_PER_USEC;