Hi, On 7/28/20 5:19 PM, Peilin Ye wrote: > raw_cmd_copyout() is potentially copying uninitialized kernel stack memory > since it is initializing `cmd` by assignment, which may cause the compiler > to leave uninitialized holes in this structure. Fix it by using memcpy() > instead. > > Cc: stable@xxxxxxxxxxxxxxx > Fixes: 2145e15e0557 ("floppy: don't write kernel-only members to FDRAWCMD ioctl output") > Suggested-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx> > Suggested-by: Arnd Bergmann <arnd@xxxxxxxx> > Signed-off-by: Peilin Ye <yepeilin.cs@xxxxxxxxx> Reviewed-by: Denis Efremov <efremov@xxxxxxxxx> ptr comes from raw_cmd_copyin and it should be ok to use memcpy. Jens, could you please take this one to your 5.9 branch? > --- > $ pahole -C "floppy_raw_cmd" drivers/block/floppy.o > struct floppy_raw_cmd { > unsigned int flags; /* 0 4 */ > > /* XXX 4 bytes hole, try to pack */ > > void * data; /* 8 8 */ > char * kernel_data; /* 16 8 */ > struct floppy_raw_cmd * next; /* 24 8 */ > long int length; /* 32 8 */ > long int phys_length; /* 40 8 */ > int buffer_length; /* 48 4 */ > unsigned char rate; /* 52 1 */ > unsigned char cmd_count; /* 53 1 */ > union { > struct { > unsigned char cmd[16]; /* 54 16 */ > /* --- cacheline 1 boundary (64 bytes) was 6 bytes ago --- */ > unsigned char reply_count; /* 70 1 */ > unsigned char reply[16]; /* 71 16 */ > }; /* 54 33 */ > unsigned char fullcmd[33]; /* 54 33 */ > }; /* 54 33 */ > > /* XXX 1 byte hole, try to pack */ > > /* --- cacheline 1 boundary (64 bytes) was 24 bytes ago --- */ > int track; /* 88 4 */ > int resultcode; /* 92 4 */ > int reserved1; /* 96 4 */ > int reserved2; /* 100 4 */ > > /* size: 104, cachelines: 2, members: 14 */ > /* sum members: 99, holes: 2, sum holes: 5 */ > /* last cacheline: 40 bytes */ > }; > It would be nice to add lkml links with discussion on the issue or https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2019/october/padding-the-struct-how-a-compiler-optimization-can-disclose-stack-memory/ in addition to pahole output. > drivers/block/floppy.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c > index 09079aee8dc4..b8ea98f7a9cb 100644 > --- a/drivers/block/floppy.c > +++ b/drivers/block/floppy.c > @@ -3126,7 +3126,9 @@ static int raw_cmd_copyout(int cmd, void __user *param, > int ret; > > while (ptr) { > - struct floppy_raw_cmd cmd = *ptr; > + struct floppy_raw_cmd cmd; > + > + memcpy(&cmd, ptr, sizeof(cmd))> cmd.next = NULL; > cmd.kernel_data = NULL; > ret = copy_to_user(param, &cmd, sizeof(cmd)); > Thanks, Denis