diff options
| -rw-r--r-- | arch/x86/kernel/cpu/mtrr/if.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/arch/x86/kernel/cpu/mtrr/if.c b/arch/x86/kernel/cpu/mtrr/if.c index f04e72527604..3c1b12d461d1 100644 --- a/arch/x86/kernel/cpu/mtrr/if.c +++ b/arch/x86/kernel/cpu/mtrr/if.c | |||
| @@ -96,17 +96,24 @@ mtrr_write(struct file *file, const char __user *buf, size_t len, loff_t * ppos) | |||
| 96 | unsigned long long base, size; | 96 | unsigned long long base, size; |
| 97 | char *ptr; | 97 | char *ptr; |
| 98 | char line[LINE_SIZE]; | 98 | char line[LINE_SIZE]; |
| 99 | int length; | ||
| 99 | size_t linelen; | 100 | size_t linelen; |
| 100 | 101 | ||
| 101 | if (!capable(CAP_SYS_ADMIN)) | 102 | if (!capable(CAP_SYS_ADMIN)) |
| 102 | return -EPERM; | 103 | return -EPERM; |
| 103 | if (!len) | ||
| 104 | return -EINVAL; | ||
| 105 | 104 | ||
| 106 | memset(line, 0, LINE_SIZE); | 105 | memset(line, 0, LINE_SIZE); |
| 107 | if (len > LINE_SIZE) | 106 | |
| 108 | len = LINE_SIZE; | 107 | length = len; |
| 109 | if (copy_from_user(line, buf, len - 1)) | 108 | length--; |
| 109 | |||
| 110 | if (length > LINE_SIZE - 1) | ||
| 111 | length = LINE_SIZE - 1; | ||
| 112 | |||
| 113 | if (length < 0) | ||
| 114 | return -EINVAL; | ||
| 115 | |||
| 116 | if (copy_from_user(line, buf, length)) | ||
| 110 | return -EFAULT; | 117 | return -EFAULT; |
| 111 | 118 | ||
| 112 | linelen = strlen(line); | 119 | linelen = strlen(line); |
