diff options
author | David Woodhouse <dwmw2@infradead.org> | 2013-03-14 13:30:20 +0000 |
---|---|---|
committer | Guenter Roeck <linux@roeck-us.net> | 2013-03-14 06:57:19 -0700 |
commit | 6975404fb9bcc3ca41946ce0506f97db30fb8705 (patch) | |
tree | 530eb057a39ca7a6822fe8054c644f8e9661e580 | |
parent | df069079c153d22adf6c28dcc0b1cf62bba75167 (diff) | |
download | op-kernel-dev-6975404fb9bcc3ca41946ce0506f97db30fb8705.zip op-kernel-dev-6975404fb9bcc3ca41946ce0506f97db30fb8705.tar.gz |
hwmon: (pmbus) Fix krealloc() misuse in pmbus_add_attribute()
If krealloc() returns NULL, it *doesn't* free the original. So any code
of the form 'foo = krealloc(foo, …);' is almost certainly a bug.
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
-rw-r--r-- | drivers/hwmon/pmbus/pmbus_core.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/hwmon/pmbus/pmbus_core.c b/drivers/hwmon/pmbus/pmbus_core.c index 80eef50..9add6092 100644 --- a/drivers/hwmon/pmbus/pmbus_core.c +++ b/drivers/hwmon/pmbus/pmbus_core.c @@ -766,12 +766,14 @@ static ssize_t pmbus_show_label(struct device *dev, static int pmbus_add_attribute(struct pmbus_data *data, struct attribute *attr) { if (data->num_attributes >= data->max_attributes - 1) { - data->max_attributes += PMBUS_ATTR_ALLOC_SIZE; - data->group.attrs = krealloc(data->group.attrs, - sizeof(struct attribute *) * - data->max_attributes, GFP_KERNEL); - if (data->group.attrs == NULL) + int new_max_attrs = data->max_attributes + PMBUS_ATTR_ALLOC_SIZE; + void *new_attrs = krealloc(data->group.attrs, + new_max_attrs * sizeof(void *), + GFP_KERNEL); + if (!new_attrs) return -ENOMEM; + data->group.attrs = new_attrs; + data->max_attributes = new_max_attrs; } data->group.attrs[data->num_attributes++] = attr; |