From: Russell King, Tom Rini, Dave Jones As plugged in 2.4 recently. Fix some leakage of uninitialised memory to userspace via rtc reads. 25-akpm/arch/cris/arch-v10/drivers/ds1302.c | 1 + 25-akpm/arch/cris/arch-v10/drivers/pcf8563.c | 1 + 25-akpm/arch/m68k/bvme6000/rtc.c | 1 + 25-akpm/arch/m68k/mvme16x/rtc.c | 1 + 25-akpm/arch/ppc64/kernel/rtc.c | 1 + 25-akpm/drivers/acorn/char/i2c.c | 1 + 25-akpm/drivers/char/efirtc.c | 1 + 25-akpm/drivers/char/rtc.c | 3 ++- 25-akpm/drivers/sbus/char/rtc.c | 1 + 9 files changed, 10 insertions(+), 1 deletion(-) diff -puN arch/cris/arch-v10/drivers/ds1302.c~rtc-leak-fixes arch/cris/arch-v10/drivers/ds1302.c --- 25/arch/cris/arch-v10/drivers/ds1302.c~rtc-leak-fixes Tue Jan 6 12:26:34 2004 +++ 25-akpm/arch/cris/arch-v10/drivers/ds1302.c Tue Jan 6 12:26:34 2004 @@ -342,6 +342,7 @@ rtc_ioctl(struct inode *inode, struct fi { struct rtc_time rtc_tm; + memset(&rtc_tm, 0, sizeof (struct rtc_time)); get_rtc_time(&rtc_tm); if (copy_to_user((struct rtc_time*)arg, &rtc_tm, sizeof(struct rtc_time))) return -EFAULT; diff -puN arch/cris/arch-v10/drivers/pcf8563.c~rtc-leak-fixes arch/cris/arch-v10/drivers/pcf8563.c --- 25/arch/cris/arch-v10/drivers/pcf8563.c~rtc-leak-fixes Tue Jan 6 12:26:34 2004 +++ 25-akpm/arch/cris/arch-v10/drivers/pcf8563.c Tue Jan 6 12:26:34 2004 @@ -219,6 +219,7 @@ pcf8563_ioctl(struct inode *inode, struc unsigned long flags; struct rtc_time tm; + memset(&tm, 0, sizeof (struct rtc_time)); if (!capable(CAP_SYS_TIME)) return -EPERM; diff -puN arch/m68k/bvme6000/rtc.c~rtc-leak-fixes arch/m68k/bvme6000/rtc.c --- 25/arch/m68k/bvme6000/rtc.c~rtc-leak-fixes Tue Jan 6 12:26:34 2004 +++ 25-akpm/arch/m68k/bvme6000/rtc.c Tue Jan 6 12:26:34 2004 @@ -53,6 +53,7 @@ static int rtc_ioctl(struct inode *inode /* Ensure clock and real-time-mode-register are accessible */ msr = rtc->msr & 0xc0; rtc->msr = 0x40; + memset(&wtime, 0, sizeof(struct rtc_time)); do { wtime.tm_sec = BCD2BIN(rtc->bcd_sec); wtime.tm_min = BCD2BIN(rtc->bcd_min); diff -puN arch/m68k/mvme16x/rtc.c~rtc-leak-fixes arch/m68k/mvme16x/rtc.c --- 25/arch/m68k/mvme16x/rtc.c~rtc-leak-fixes Tue Jan 6 12:26:34 2004 +++ 25-akpm/arch/m68k/mvme16x/rtc.c Tue Jan 6 12:26:34 2004 @@ -51,6 +51,7 @@ static int rtc_ioctl(struct inode *inode local_irq_save(flags); /* Ensure clock and real-time-mode-register are accessible */ rtc->ctrl = RTC_READ; + memset(&wtime, 0, sizeof(struct rtc_time)); wtime.tm_sec = BCD2BIN(rtc->bcd_sec); wtime.tm_min = BCD2BIN(rtc->bcd_min); wtime.tm_hour = BCD2BIN(rtc->bcd_hr); diff -puN arch/ppc64/kernel/rtc.c~rtc-leak-fixes arch/ppc64/kernel/rtc.c --- 25/arch/ppc64/kernel/rtc.c~rtc-leak-fixes Tue Jan 6 12:26:34 2004 +++ 25-akpm/arch/ppc64/kernel/rtc.c Tue Jan 6 12:26:34 2004 @@ -99,6 +99,7 @@ static int rtc_ioctl(struct inode *inode switch (cmd) { case RTC_RD_TIME: /* Read the time/date from RTC */ { + memset(&wtime, 0, sizeof(struct rtc_time)); ppc_md.get_rtc_time(&wtime); break; } diff -puN drivers/acorn/char/i2c.c~rtc-leak-fixes drivers/acorn/char/i2c.c --- 25/drivers/acorn/char/i2c.c~rtc-leak-fixes Tue Jan 6 12:26:34 2004 +++ 25-akpm/drivers/acorn/char/i2c.c Tue Jan 6 12:26:34 2004 @@ -167,6 +167,7 @@ static int rtc_ioctl(struct inode *inode break; case RTC_RD_TIME: + memset(&rtctm, 0, sizeof(struct rtc_time)); get_rtc_time(&rtc_raw, &year); rtctm.tm_sec = rtc_raw.secs; rtctm.tm_min = rtc_raw.mins; diff -puN drivers/char/efirtc.c~rtc-leak-fixes drivers/char/efirtc.c --- 25/drivers/char/efirtc.c~rtc-leak-fixes Tue Jan 6 12:26:34 2004 +++ 25-akpm/drivers/char/efirtc.c Tue Jan 6 12:26:34 2004 @@ -118,6 +118,7 @@ convert_to_efi_time(struct rtc_time *wti static void convert_from_efi_time(efi_time_t *eft, struct rtc_time *wtime) { + memset(wtime, 0, sizeof(*wtime)); wtime->tm_sec = eft->second; wtime->tm_min = eft->minute; wtime->tm_hour = eft->hour; diff -puN drivers/char/rtc.c~rtc-leak-fixes drivers/char/rtc.c --- 25/drivers/char/rtc.c~rtc-leak-fixes Tue Jan 6 12:26:34 2004 +++ 25-akpm/drivers/char/rtc.c Tue Jan 6 12:26:34 2004 @@ -431,7 +431,7 @@ static int rtc_do_ioctl(unsigned int cmd * means "don't care" or "match all". Only the tm_hour, * tm_min, and tm_sec values are filled in. */ - + memset(&wtime, 0, sizeof(struct rtc_time)); get_rtc_alm_time(&wtime); break; } @@ -481,6 +481,7 @@ static int rtc_do_ioctl(unsigned int cmd } case RTC_RD_TIME: /* Read the time/date from RTC */ { + memset(&wtime, 0, sizeof(struct rtc_time)); rtc_get_rtc_time(&wtime); break; } diff -puN drivers/sbus/char/rtc.c~rtc-leak-fixes drivers/sbus/char/rtc.c --- 25/drivers/sbus/char/rtc.c~rtc-leak-fixes Tue Jan 6 12:26:34 2004 +++ 25-akpm/drivers/sbus/char/rtc.c Tue Jan 6 12:26:34 2004 @@ -89,6 +89,7 @@ static int rtc_ioctl(struct inode *inode switch (cmd) { case RTCGET: + memset(&rtc_tm, 0, sizeof(struct rtc_time)); get_rtc_time(&rtc_tm); if (copy_to_user((struct rtc_time*)arg, &rtc_tm, sizeof(struct rtc_time))) _