diff options
| -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 4008e2ce73c1..fdbcc9fd6d31 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(); |
