Check that the input size does not exceed the buffer size.
If a caller write more characters, count is truncated to the max available
space in "simple_write_to_buffer".
Write a zero termination afterwards.
Signed-off-by: Markus Burri <markus.burri@mt.com>
---
drivers/gpio/gpio-virtuser.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/drivers/gpio/gpio-virtuser.c b/drivers/gpio/gpio-virtuser.c
index 13407fd4f0eb..9f3c491f5af1 100644
--- a/drivers/gpio/gpio-virtuser.c
+++ b/drivers/gpio/gpio-virtuser.c
@@ -401,10 +401,15 @@ static ssize_t gpio_virtuser_direction_do_write(struct file *file,
char buf[32], *trimmed;
int ret, dir, val = 0;
- ret = simple_write_to_buffer(buf, sizeof(buf), ppos, user_buf, count);
+ if (size >= sizeof(buf))
+ return -EINVAL;
+
+ ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, user_buf, count);
if (ret < 0)
return ret;
+ buf[ret] = '\0';
+
trimmed = strim(buf);
if (strcmp(trimmed, "input") == 0) {
@@ -623,12 +628,15 @@ static ssize_t gpio_virtuser_consumer_write(struct file *file,
char buf[GPIO_VIRTUSER_NAME_BUF_LEN + 2];
int ret;
+ if (count >= sizeof(buf))
+ return -EINVAL;
+
ret = simple_write_to_buffer(buf, GPIO_VIRTUSER_NAME_BUF_LEN, ppos,
user_buf, count);
if (ret < 0)
return ret;
- buf[strlen(buf) - 1] = '\0';
+ buf[ret] = '\0';
ret = gpiod_set_consumer_name(data->ad.desc, buf);
if (ret)
--
2.39.5
On Thu, May 8, 2025 at 3:07 PM Markus Burri <markus.burri@mt.com> wrote: > > Check that the input size does not exceed the buffer size. > If a caller write more characters, count is truncated to the max available > space in "simple_write_to_buffer". > Write a zero termination afterwards. > > Signed-off-by: Markus Burri <markus.burri@mt.com> > --- Looks good and does fix an issue that can be easily reproduced with KASAN enabled. Please fix the issues reported by the build bot and resend (as a patch separate from the rest of this series). Thanks. Bartosz
Hi Markus,
kernel test robot noticed the following build errors:
[auto build test ERROR on b4432656b36e5cc1d50a1f2dc15357543add530e]
url: https://github.com/intel-lab-lkp/linux/commits/Markus-Burri/iio-backend-fix-out-of-bound-write/20250508-211644
base: b4432656b36e5cc1d50a1f2dc15357543add530e
patch link: https://lore.kernel.org/r/20250508130612.82270-5-markus.burri%40mt.com
patch subject: [PATCH v4 4/6] gpio: fix potential out-of-bound write
config: x86_64-buildonly-randconfig-003-20250509 (https://download.01.org/0day-ci/archive/20250509/202505091754.285hHbr2-lkp@intel.com/config)
compiler: clang version 20.1.2 (https://github.com/llvm/llvm-project 58df0ef89dd64126512e4ee27b4ac3fd8ddf6247)
rustc: rustc 1.78.0 (9b00956e5 2024-04-29)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250509/202505091754.285hHbr2-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202505091754.285hHbr2-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/gpio/gpio-virtuser.c:404:6: error: use of undeclared identifier 'size'; did you mean 'ksize'?
404 | if (size >= sizeof(buf))
| ^~~~
| ksize
include/linux/slab.h:491:8: note: 'ksize' declared here
491 | size_t ksize(const void *objp);
| ^
1 error generated.
vim +404 drivers/gpio/gpio-virtuser.c
393
394 static ssize_t gpio_virtuser_direction_do_write(struct file *file,
395 const char __user *user_buf,
396 size_t count, loff_t *ppos,
397 bool atomic)
398 {
399 struct gpio_virtuser_line_data *data = file->private_data;
400 struct gpio_desc *desc = data->ad.desc;
401 char buf[32], *trimmed;
402 int ret, dir, val = 0;
403
> 404 if (size >= sizeof(buf))
405 return -EINVAL;
406
407 ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, user_buf, count);
408 if (ret < 0)
409 return ret;
410
411 buf[ret] = '\0';
412
413 trimmed = strim(buf);
414
415 if (strcmp(trimmed, "input") == 0) {
416 dir = 1;
417 } else if (strcmp(trimmed, "output-high") == 0) {
418 dir = 0;
419 val = 1;
420 } else if (strcmp(trimmed, "output-low") == 0) {
421 dir = val = 0;
422 } else {
423 return -EINVAL;
424 }
425
426 if (!atomic)
427 ret = gpio_virtuser_set_direction(desc, dir, val);
428 else
429 ret = gpio_virtuser_set_direction_atomic(desc, dir, val);
430 if (ret)
431 return ret;
432
433 return count;
434 }
435
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
© 2016 - 2025 Red Hat, Inc.