summaryrefslogtreecommitdiffstats
path: root/block/bfq-iosched.c
diff options
context:
space:
mode:
authorBart Van Assche <bart.vanassche@wdc.com>2017-08-30 14:42:09 -0400
committerJens Axboe <axboe@kernel.dk>2017-09-01 15:56:39 -0400
commit2f79136ba2df07ce7563158f7948c4ce770f8132 (patch)
tree2a68b34d5162b00bf65a3fcb8f32d61eaa31623a /block/bfq-iosched.c
parentdfb79af5469a028e23ba2592a577d9b6f8a5651f (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.c52
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
4805static void bfq_var_store(unsigned long *var, const char *page) 4805static 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);
4877static ssize_t __FUNC(struct elevator_queue *e, const char *page, size_t count)\ 4883static 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;