On Sun, Nov 14, 2010 at 18:06 -0800, Andrew Morton wrote: > On Sun, 14 Nov 2010 12:25:33 +0300 Vasiliy Kulikov <segoon@xxxxxxxxxxxx> wrote: > > > 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. > > > > Signed-off-by: Vasiliy Kulikov <segoon@xxxxxxxxxxxx> > > --- > > Patch v1 used memset(), it was waste of cycles on almost all archs. > > > > Compile tested. > > > > fs/select.c | 7 ++++--- > > 1 files changed, 4 insertions(+), 3 deletions(-) > > > > diff --git a/fs/select.c b/fs/select.c > > index b7b10aa..43d4805 100644 > > --- a/fs/select.c > > +++ b/fs/select.c > > @@ -288,7 +288,6 @@ static int poll_select_copy_remaining(struct timespec *end_time, void __user *p, > > int timeval, int ret) > > { > > struct timespec rts; > > - struct timeval rtv; > > > > if (!p) > > return ret; > > @@ -306,8 +305,10 @@ static int poll_select_copy_remaining(struct timespec *end_time, void __user *p, > > rts.tv_sec = rts.tv_nsec = 0; > > > > if (timeval) { > > - rtv.tv_sec = rts.tv_sec; > > - rtv.tv_usec = rts.tv_nsec / NSEC_PER_USEC; > > + struct timeval rtv = { > > + .tv_sec = rts.tv_sec, > > + .tv_usec = rts.tv_nsec / NSEC_PER_USEC > > + }; > > > > if (!copy_to_user(p, &rtv, sizeof(rtv))) > > return ret; > > Please check the assembly code - this will still leave four bytes of > uninitalised stack data in 'rtv', surely. This concrete c code generates movl + movq, movl would zero unnamed 4 bytes. However, I cannot find whether this behavior is guaranteed... -- Vasiliy Kulikov -- To unsubscribe from this list: send the line "unsubscribe kernel-janitors" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html