diff options
author | Bart Van Assche <bart.vanassche@wdc.com> | 2017-08-30 14:42:09 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2017-09-01 15:56:39 -0400 |
commit | 2f79136ba2df07ce7563158f7948c4ce770f8132 (patch) | |
tree | 2a68b34d5162b00bf65a3fcb8f32d61eaa31623a /block/bfq-iosched.c | |
parent | dfb79af5469a028e23ba2592a577d9b6f8a5651f (diff) |
bfq: Check kstrtoul() return value
Make sysfs writes fail for invalid numbers instead of storing
uninitialized data copied from the stack. This patch removes
all uninitialized_var() occurrences from the BFQ source code.
Acked-by: Paolo Valente <paolo.valente@linaro.org>
Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/bfq-iosched.c')
-rw-r--r-- | block/bfq-iosched.c | 52 |
1 files changed, 37 insertions, 15 deletions
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c index 856f4199a470..0f286cd5da95 100644 --- a/block/bfq-iosched.c +++ b/block/bfq-iosched.c | |||
@@ -4802,13 +4802,15 @@ static ssize_t bfq_var_show(unsigned int var, char *page) | |||
4802 | return sprintf(page, "%u\n", var); | 4802 | return sprintf(page, "%u\n", var); |
4803 | } | 4803 | } |
4804 | 4804 | ||
4805 | static void bfq_var_store(unsigned long *var, const char *page) | 4805 | static int bfq_var_store(unsigned long *var, const char *page) |
4806 | { | 4806 | { |
4807 | unsigned long new_val; | 4807 | unsigned long new_val; |
4808 | int ret = kstrtoul(page, 10, &new_val); | 4808 | int ret = kstrtoul(page, 10, &new_val); |
4809 | 4809 | ||
4810 | if (ret == 0) | 4810 | if (ret) |
4811 | *var = new_val; | 4811 | return ret; |
4812 | *var = new_val; | ||
4813 | return 0; | ||
4812 | } | 4814 | } |
4813 | 4815 | ||
4814 | #define SHOW_FUNCTION(__FUNC, __VAR, __CONV) \ | 4816 | #define SHOW_FUNCTION(__FUNC, __VAR, __CONV) \ |
@@ -4849,8 +4851,12 @@ static ssize_t \ | |||
4849 | __FUNC(struct elevator_queue *e, const char *page, size_t count) \ | 4851 | __FUNC(struct elevator_queue *e, const char *page, size_t count) \ |
4850 | { \ | 4852 | { \ |
4851 | struct bfq_data *bfqd = e->elevator_data; \ | 4853 | struct bfq_data *bfqd = e->elevator_data; \ |
4852 | unsigned long uninitialized_var(__data); \ | 4854 | unsigned long __data; \ |
4853 | bfq_var_store(&__data, (page)); \ | 4855 | int ret; \ |
4856 | \ | ||
4857 | ret = bfq_var_store(&__data, (page)); \ | ||
4858 | if (ret) \ | ||
4859 | return ret; \ | ||
4854 | if (__data < (MIN)) \ | 4860 | if (__data < (MIN)) \ |
4855 | __data = (MIN); \ | 4861 | __data = (MIN); \ |
4856 | else if (__data > (MAX)) \ | 4862 | else if (__data > (MAX)) \ |
@@ -4877,8 +4883,12 @@ STORE_FUNCTION(bfq_slice_idle_store, &bfqd->bfq_slice_idle, 0, INT_MAX, 2); | |||
4877 | static ssize_t __FUNC(struct elevator_queue *e, const char *page, size_t count)\ | 4883 | static ssize_t __FUNC(struct elevator_queue *e, const char *page, size_t count)\ |
4878 | { \ | 4884 | { \ |
4879 | struct bfq_data *bfqd = e->elevator_data; \ | 4885 | struct bfq_data *bfqd = e->elevator_data; \ |
4880 | unsigned long uninitialized_var(__data); \ | 4886 | unsigned long __data; \ |
4881 | bfq_var_store(&__data, (page)); \ | 4887 | int ret; \ |
4888 | \ | ||
4889 | ret = bfq_var_store(&__data, (page)); \ | ||
4890 | if (ret) \ | ||
4891 | return ret; \ | ||
4882 | if (__data < (MIN)) \ | 4892 | if (__data < (MIN)) \ |
4883 | __data = (MIN); \ | 4893 | __data = (MIN); \ |
4884 | else if (__data > (MAX)) \ | 4894 | else if (__data > (MAX)) \ |
@@ -4894,9 +4904,12 @@ static ssize_t bfq_max_budget_store(struct elevator_queue *e, | |||
4894 | const char *page, size_t count) | 4904 | const char *page, size_t count) |
4895 | { | 4905 | { |
4896 | struct bfq_data *bfqd = e->elevator_data; | 4906 | struct bfq_data *bfqd = e->elevator_data; |
4897 | unsigned long uninitialized_var(__data); | 4907 | unsigned long __data; |
4908 | int ret; | ||
4898 | 4909 | ||
4899 | bfq_var_store(&__data, (page)); | 4910 | ret = bfq_var_store(&__data, (page)); |
4911 | if (ret) | ||
4912 | return ret; | ||
4900 | 4913 | ||
4901 | if (__data == 0) | 4914 | if (__data == 0) |
4902 | bfqd->bfq_max_budget = bfq_calc_max_budget(bfqd); | 4915 | bfqd->bfq_max_budget = bfq_calc_max_budget(bfqd); |
@@ -4919,9 +4932,12 @@ static ssize_t bfq_timeout_sync_store(struct elevator_queue *e, | |||
4919 | const char *page, size_t count) | 4932 | const char *page, size_t count) |
4920 | { | 4933 | { |
4921 | struct bfq_data *bfqd = e->elevator_data; | 4934 | struct bfq_data *bfqd = e->elevator_data; |
4922 | unsigned long uninitialized_var(__data); | 4935 | unsigned long __data; |
4936 | int ret; | ||
4923 | 4937 | ||
4924 | bfq_var_store(&__data, (page)); | 4938 | ret = bfq_var_store(&__data, (page)); |
4939 | if (ret) | ||
4940 | return ret; | ||
4925 | 4941 | ||
4926 | if (__data < 1) | 4942 | if (__data < 1) |
4927 | __data = 1; | 4943 | __data = 1; |
@@ -4939,9 +4955,12 @@ static ssize_t bfq_strict_guarantees_store(struct elevator_queue *e, | |||
4939 | const char *page, size_t count) | 4955 | const char *page, size_t count) |
4940 | { | 4956 | { |
4941 | struct bfq_data *bfqd = e->elevator_data; | 4957 | struct bfq_data *bfqd = e->elevator_data; |
4942 | unsigned long uninitialized_var(__data); | 4958 | unsigned long __data; |
4959 | int ret; | ||
4943 | 4960 | ||
4944 | bfq_var_store(&__data, (page)); | 4961 | ret = bfq_var_store(&__data, (page)); |
4962 | if (ret) | ||
4963 | return ret; | ||
4945 | 4964 | ||
4946 | if (__data > 1) | 4965 | if (__data > 1) |
4947 | __data = 1; | 4966 | __data = 1; |
@@ -4958,9 +4977,12 @@ static ssize_t bfq_low_latency_store(struct elevator_queue *e, | |||
4958 | const char *page, size_t count) | 4977 | const char *page, size_t count) |
4959 | { | 4978 | { |
4960 | struct bfq_data *bfqd = e->elevator_data; | 4979 | struct bfq_data *bfqd = e->elevator_data; |
4961 | unsigned long uninitialized_var(__data); | 4980 | unsigned long __data; |
4981 | int ret; | ||
4962 | 4982 | ||
4963 | bfq_var_store(&__data, (page)); | 4983 | ret = bfq_var_store(&__data, (page)); |
4984 | if (ret) | ||
4985 | return ret; | ||
4964 | 4986 | ||
4965 | if (__data > 1) | 4987 | if (__data > 1) |
4966 | __data = 1; | 4988 | __data = 1; |