Skip to content

Commit 88da5f4

Browse files
committed
Merge tag 'w1-drv-6.20' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/krzk/linux-w1 into char-misc-linus
1-Wire bus drivers fixes Non critical (old issues) fixes: 1. Fix possible buffer overflow in W1 thermal driver sysfs interfasce, 2. Drop duplicated device put when attaching a slave device failed, which could lead to memory corruption. * tag 'w1-drv-6.20' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/krzk/linux-w1: w1: fix redundant counter decrement in w1_attach_slave_device() w1: therm: Fix off-by-one buffer overflow in alarms_store
2 parents e03b29b + cc8f92e commit 88da5f4

2 files changed

Lines changed: 20 additions & 44 deletions

File tree

drivers/w1/slaves/w1_therm.c

Lines changed: 20 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1836,53 +1836,35 @@ static ssize_t alarms_store(struct device *device,
18361836
struct w1_slave *sl = dev_to_w1_slave(device);
18371837
struct therm_info info;
18381838
u8 new_config_register[3]; /* array of data to be written */
1839-
int temp, ret;
1840-
char *token = NULL;
1839+
long long temp;
1840+
int ret = 0;
18411841
s8 tl, th; /* 1 byte per value + temp ring order */
1842-
char *p_args, *orig;
1843-
1844-
p_args = orig = kmalloc(size, GFP_KERNEL);
1845-
/* Safe string copys as buf is const */
1846-
if (!p_args) {
1847-
dev_warn(device,
1848-
"%s: error unable to allocate memory %d\n",
1849-
__func__, -ENOMEM);
1850-
return size;
1851-
}
1852-
strcpy(p_args, buf);
1853-
1854-
/* Split string using space char */
1855-
token = strsep(&p_args, " ");
1856-
1857-
if (!token) {
1858-
dev_info(device,
1859-
"%s: error parsing args %d\n", __func__, -EINVAL);
1860-
goto free_m;
1861-
}
1862-
1863-
/* Convert 1st entry to int */
1864-
ret = kstrtoint (token, 10, &temp);
1842+
const char *p = buf;
1843+
char *endp;
1844+
1845+
temp = simple_strtoll(p, &endp, 10);
1846+
if (p == endp || *endp != ' ')
1847+
ret = -EINVAL;
1848+
else if (temp < INT_MIN || temp > INT_MAX)
1849+
ret = -ERANGE;
18651850
if (ret) {
18661851
dev_info(device,
18671852
"%s: error parsing args %d\n", __func__, ret);
1868-
goto free_m;
1853+
return size;
18691854
}
18701855

18711856
tl = int_to_short(temp);
18721857

1873-
/* Split string using space char */
1874-
token = strsep(&p_args, " ");
1875-
if (!token) {
1876-
dev_info(device,
1877-
"%s: error parsing args %d\n", __func__, -EINVAL);
1878-
goto free_m;
1879-
}
1880-
/* Convert 2nd entry to int */
1881-
ret = kstrtoint (token, 10, &temp);
1858+
p = endp + 1;
1859+
temp = simple_strtoll(p, &endp, 10);
1860+
if (p == endp)
1861+
ret = -EINVAL;
1862+
else if (temp < INT_MIN || temp > INT_MAX)
1863+
ret = -ERANGE;
18821864
if (ret) {
18831865
dev_info(device,
18841866
"%s: error parsing args %d\n", __func__, ret);
1885-
goto free_m;
1867+
return size;
18861868
}
18871869

18881870
/* Prepare to cast to short by eliminating out of range values */
@@ -1905,15 +1887,15 @@ static ssize_t alarms_store(struct device *device,
19051887
dev_info(device,
19061888
"%s: error reading from the slave device %d\n",
19071889
__func__, ret);
1908-
goto free_m;
1890+
return size;
19091891
}
19101892

19111893
/* Write data in the device RAM */
19121894
if (!SLAVE_SPECIFIC_FUNC(sl)) {
19131895
dev_info(device,
19141896
"%s: Device not supported by the driver %d\n",
19151897
__func__, -ENODEV);
1916-
goto free_m;
1898+
return size;
19171899
}
19181900

19191901
ret = SLAVE_SPECIFIC_FUNC(sl)->write_data(sl, new_config_register);
@@ -1922,10 +1904,6 @@ static ssize_t alarms_store(struct device *device,
19221904
"%s: error writing to the slave device %d\n",
19231905
__func__, ret);
19241906

1925-
free_m:
1926-
/* free allocated memory */
1927-
kfree(orig);
1928-
19291907
return size;
19301908
}
19311909

drivers/w1/w1.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -758,8 +758,6 @@ int w1_attach_slave_device(struct w1_master *dev, struct w1_reg_num *rn)
758758
if (err < 0) {
759759
dev_err(&dev->dev, "%s: Attaching %s failed.\n", __func__,
760760
sl->name);
761-
dev->slave_count--;
762-
w1_family_put(sl->family);
763761
atomic_dec(&sl->master->refcnt);
764762
kfree(sl);
765763
return err;

0 commit comments

Comments
 (0)