diff options
| -rw-r--r-- | arch/s390/oprofile/init.c | 2 | ||||
| -rw-r--r-- | drivers/oprofile/oprofile_files.c | 7 | ||||
| -rw-r--r-- | drivers/oprofile/oprofilefs.c | 11 |
3 files changed, 14 insertions, 6 deletions
diff --git a/arch/s390/oprofile/init.c b/arch/s390/oprofile/init.c index 6efc18b5e60a..bd58b72454cf 100644 --- a/arch/s390/oprofile/init.c +++ b/arch/s390/oprofile/init.c | |||
| @@ -88,7 +88,7 @@ static ssize_t hwsampler_write(struct file *file, char const __user *buf, | |||
| 88 | return -EINVAL; | 88 | return -EINVAL; |
| 89 | 89 | ||
| 90 | retval = oprofilefs_ulong_from_user(&val, buf, count); | 90 | retval = oprofilefs_ulong_from_user(&val, buf, count); |
| 91 | if (retval) | 91 | if (retval <= 0) |
| 92 | return retval; | 92 | return retval; |
| 93 | 93 | ||
| 94 | if (oprofile_started) | 94 | if (oprofile_started) |
diff --git a/drivers/oprofile/oprofile_files.c b/drivers/oprofile/oprofile_files.c index 89f63456646f..84a208dbed93 100644 --- a/drivers/oprofile/oprofile_files.c +++ b/drivers/oprofile/oprofile_files.c | |||
| @@ -45,7 +45,7 @@ static ssize_t timeout_write(struct file *file, char const __user *buf, | |||
| 45 | return -EINVAL; | 45 | return -EINVAL; |
| 46 | 46 | ||
| 47 | retval = oprofilefs_ulong_from_user(&val, buf, count); | 47 | retval = oprofilefs_ulong_from_user(&val, buf, count); |
| 48 | if (retval) | 48 | if (retval <= 0) |
| 49 | return retval; | 49 | return retval; |
| 50 | 50 | ||
| 51 | retval = oprofile_set_timeout(val); | 51 | retval = oprofile_set_timeout(val); |
| @@ -84,7 +84,7 @@ static ssize_t depth_write(struct file *file, char const __user *buf, size_t cou | |||
| 84 | return -EINVAL; | 84 | return -EINVAL; |
| 85 | 85 | ||
| 86 | retval = oprofilefs_ulong_from_user(&val, buf, count); | 86 | retval = oprofilefs_ulong_from_user(&val, buf, count); |
| 87 | if (retval) | 87 | if (retval <= 0) |
| 88 | return retval; | 88 | return retval; |
| 89 | 89 | ||
| 90 | retval = oprofile_set_ulong(&oprofile_backtrace_depth, val); | 90 | retval = oprofile_set_ulong(&oprofile_backtrace_depth, val); |
| @@ -141,9 +141,10 @@ static ssize_t enable_write(struct file *file, char const __user *buf, size_t co | |||
| 141 | return -EINVAL; | 141 | return -EINVAL; |
| 142 | 142 | ||
| 143 | retval = oprofilefs_ulong_from_user(&val, buf, count); | 143 | retval = oprofilefs_ulong_from_user(&val, buf, count); |
| 144 | if (retval) | 144 | if (retval <= 0) |
| 145 | return retval; | 145 | return retval; |
| 146 | 146 | ||
| 147 | retval = 0; | ||
| 147 | if (val) | 148 | if (val) |
| 148 | retval = oprofile_start(); | 149 | retval = oprofile_start(); |
| 149 | else | 150 | else |
diff --git a/drivers/oprofile/oprofilefs.c b/drivers/oprofile/oprofilefs.c index d0de6cc2d7a5..2f0aa0f700e6 100644 --- a/drivers/oprofile/oprofilefs.c +++ b/drivers/oprofile/oprofilefs.c | |||
| @@ -60,6 +60,13 @@ ssize_t oprofilefs_ulong_to_user(unsigned long val, char __user *buf, size_t cou | |||
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | 62 | ||
| 63 | /* | ||
| 64 | * Note: If oprofilefs_ulong_from_user() returns 0, then *val remains | ||
| 65 | * unchanged and might be uninitialized. This follows write syscall | ||
| 66 | * implementation when count is zero: "If count is zero ... [and if] | ||
| 67 | * no errors are detected, 0 will be returned without causing any | ||
| 68 | * other effect." (man 2 write) | ||
| 69 | */ | ||
| 63 | int oprofilefs_ulong_from_user(unsigned long *val, char const __user *buf, size_t count) | 70 | int oprofilefs_ulong_from_user(unsigned long *val, char const __user *buf, size_t count) |
| 64 | { | 71 | { |
| 65 | char tmpbuf[TMPBUFSIZE]; | 72 | char tmpbuf[TMPBUFSIZE]; |
| @@ -79,7 +86,7 @@ int oprofilefs_ulong_from_user(unsigned long *val, char const __user *buf, size_ | |||
| 79 | raw_spin_lock_irqsave(&oprofilefs_lock, flags); | 86 | raw_spin_lock_irqsave(&oprofilefs_lock, flags); |
| 80 | *val = simple_strtoul(tmpbuf, NULL, 0); | 87 | *val = simple_strtoul(tmpbuf, NULL, 0); |
| 81 | raw_spin_unlock_irqrestore(&oprofilefs_lock, flags); | 88 | raw_spin_unlock_irqrestore(&oprofilefs_lock, flags); |
| 82 | return 0; | 89 | return count; |
| 83 | } | 90 | } |
| 84 | 91 | ||
| 85 | 92 | ||
| @@ -99,7 +106,7 @@ static ssize_t ulong_write_file(struct file *file, char const __user *buf, size_ | |||
| 99 | return -EINVAL; | 106 | return -EINVAL; |
| 100 | 107 | ||
| 101 | retval = oprofilefs_ulong_from_user(&value, buf, count); | 108 | retval = oprofilefs_ulong_from_user(&value, buf, count); |
| 102 | if (retval) | 109 | if (retval <= 0) |
| 103 | return retval; | 110 | return retval; |
| 104 | 111 | ||
| 105 | retval = oprofile_set_ulong(file->private_data, value); | 112 | retval = oprofile_set_ulong(file->private_data, value); |
