Commit d722f1e0 authored by Len Baker's avatar Len Baker Committed by Jonathan Cameron

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/88Signed-off-by: default avatarLen Baker <len.baker@gmx.com>
Link: https://lore.kernel.org/r/20210815174204.126593-1-len.baker@gmx.comSigned-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 12ed2786
......@@ -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:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment