diff options
Diffstat (limited to 'drivers/char/nvram.c')
-rw-r--r-- | drivers/char/nvram.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/char/nvram.c b/drivers/char/nvram.c index 4008e2ce73c..fdbcc9fd6d3 100644 --- a/drivers/char/nvram.c +++ b/drivers/char/nvram.c | |||
@@ -264,10 +264,16 @@ static ssize_t nvram_write(struct file *file, const char __user *buf, | |||
264 | unsigned char contents[NVRAM_BYTES]; | 264 | unsigned char contents[NVRAM_BYTES]; |
265 | unsigned i = *ppos; | 265 | unsigned i = *ppos; |
266 | unsigned char *tmp; | 266 | unsigned char *tmp; |
267 | int len; | ||
268 | 267 | ||
269 | len = (NVRAM_BYTES - i) < count ? (NVRAM_BYTES - i) : count; | 268 | if (i >= NVRAM_BYTES) |
270 | if (copy_from_user(contents, buf, len)) | 269 | return 0; /* Past EOF */ |
270 | |||
271 | if (count > NVRAM_BYTES - i) | ||
272 | count = NVRAM_BYTES - i; | ||
273 | if (count > NVRAM_BYTES) | ||
274 | return -EFAULT; /* Can't happen, but prove it to gcc */ | ||
275 | |||
276 | if (copy_from_user(contents, buf, count)) | ||
271 | return -EFAULT; | 277 | return -EFAULT; |
272 | 278 | ||
273 | spin_lock_irq(&rtc_lock); | 279 | spin_lock_irq(&rtc_lock); |
@@ -275,7 +281,7 @@ static ssize_t nvram_write(struct file *file, const char __user *buf, | |||
275 | if (!__nvram_check_checksum()) | 281 | if (!__nvram_check_checksum()) |
276 | goto checksum_err; | 282 | goto checksum_err; |
277 | 283 | ||
278 | for (tmp = contents; count-- > 0 && i < NVRAM_BYTES; ++i, ++tmp) | 284 | for (tmp = contents; count--; ++i, ++tmp) |
279 | __nvram_write_byte(*tmp, i); | 285 | __nvram_write_byte(*tmp, i); |
280 | 286 | ||
281 | __nvram_set_checksum(); | 287 | __nvram_set_checksum(); |