drivers/iio: Remove all strcpy() uses
strcpy() performs no bounds checking on the destination buffer. This could result in linear overflows beyond the end of the buffer, leading to all kinds of misbehaviors. So, remove all the uses and add devm_kstrdup() or devm_kasprintf() instead. Also, modify the "for" loop conditions to clarify the access to the st->orientation.rotation buffer. This patch is an effort to clean up the proliferation of str*() functions in the kernel and a previous step in the path to remove the strcpy function from the kernel entirely [1]. [1] https://github.com/KSPP/linux/issues/88 Signed-off-by: Len Baker <len.baker@gmx.com> Link: https://lore.kernel.org/r/20210815174204.126593-1-len.baker@gmx.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
12ed27863e
commit
d722f1e06f
@ -261,6 +261,7 @@ int inv_mpu_magn_set_rate(const struct inv_mpu6050_state *st, int fifo_rate)
|
||||
*/
|
||||
int inv_mpu_magn_set_orient(struct inv_mpu6050_state *st)
|
||||
{
|
||||
struct device *dev = regmap_get_device(st->map);
|
||||
const char *orient;
|
||||
char *str;
|
||||
int i;
|
||||
@ -279,22 +280,27 @@ int inv_mpu_magn_set_orient(struct inv_mpu6050_state *st)
|
||||
st->magn_orient.rotation[4] = st->orientation.rotation[1];
|
||||
st->magn_orient.rotation[5] = st->orientation.rotation[2];
|
||||
/* z <- -z */
|
||||
for (i = 0; i < 3; ++i) {
|
||||
orient = st->orientation.rotation[6 + i];
|
||||
/* use length + 2 for adding minus sign if needed */
|
||||
str = devm_kzalloc(regmap_get_device(st->map),
|
||||
strlen(orient) + 2, GFP_KERNEL);
|
||||
if (str == NULL)
|
||||
for (i = 6; i < 9; ++i) {
|
||||
orient = st->orientation.rotation[i];
|
||||
|
||||
/*
|
||||
* The value is negated according to one of the following
|
||||
* rules:
|
||||
*
|
||||
* 1) Drop leading minus.
|
||||
* 2) Leave 0 as is.
|
||||
* 3) Add leading minus.
|
||||
*/
|
||||
if (orient[0] == '-')
|
||||
str = devm_kstrdup(dev, orient + 1, GFP_KERNEL);
|
||||
else if (!strcmp(orient, "0"))
|
||||
str = devm_kstrdup(dev, orient, GFP_KERNEL);
|
||||
else
|
||||
str = devm_kasprintf(dev, GFP_KERNEL, "-%s", orient);
|
||||
if (!str)
|
||||
return -ENOMEM;
|
||||
if (strcmp(orient, "0") == 0) {
|
||||
strcpy(str, orient);
|
||||
} else if (orient[0] == '-') {
|
||||
strcpy(str, &orient[1]);
|
||||
} else {
|
||||
str[0] = '-';
|
||||
strcpy(&str[1], orient);
|
||||
}
|
||||
st->magn_orient.rotation[6 + i] = str;
|
||||
|
||||
st->magn_orient.rotation[i] = str;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
Loading…
Reference in New Issue
Block a user