提交 3d8e0090 编写于 作者: Z Zhang Rui 提交者: Rafael J. Wysocki

ACPI: fix create_modalias() return value handling

Currently, create_modalias() handles the output truncated case in
an improper way (return -EINVAL).
Plus, acpi_device_uevent() and acpi_device_modalias_show() do
improper check for the create_modalias() return value as well.

This patch fixes create_modalias() to
return -EINVAL if there is an output error,
return -ENOMEM if the output is truncated,
and also fixes both acpi_device_uevent() and acpi_device_modalias_show()
to do proper return value check.
Signed-off-by: NZhang Rui <rui.zhang@intel.com>
Reviewed-by: NMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
上级 7e22e911
...@@ -85,6 +85,9 @@ int acpi_scan_add_handler_with_hotplug(struct acpi_scan_handler *handler, ...@@ -85,6 +85,9 @@ int acpi_scan_add_handler_with_hotplug(struct acpi_scan_handler *handler,
* Creates hid/cid(s) string needed for modalias and uevent * Creates hid/cid(s) string needed for modalias and uevent
* e.g. on a device with hid:IBM0001 and cid:ACPI0001 you get: * e.g. on a device with hid:IBM0001 and cid:ACPI0001 you get:
* char *modalias: "acpi:IBM0001:ACPI0001" * char *modalias: "acpi:IBM0001:ACPI0001"
* Return: 0: no _HID and no _CID
* -EINVAL: output error
* -ENOMEM: output is truncated
*/ */
static int create_modalias(struct acpi_device *acpi_dev, char *modalias, static int create_modalias(struct acpi_device *acpi_dev, char *modalias,
int size) int size)
...@@ -101,8 +104,10 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias, ...@@ -101,8 +104,10 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias,
list_for_each_entry(id, &acpi_dev->pnp.ids, list) { list_for_each_entry(id, &acpi_dev->pnp.ids, list) {
count = snprintf(&modalias[len], size, "%s:", id->id); count = snprintf(&modalias[len], size, "%s:", id->id);
if (count < 0 || count >= size) if (count < 0)
return -EINVAL; return EINVAL;
if (count >= size)
return -ENOMEM;
len += count; len += count;
size -= count; size -= count;
} }
...@@ -116,10 +121,9 @@ acpi_device_modalias_show(struct device *dev, struct device_attribute *attr, cha ...@@ -116,10 +121,9 @@ acpi_device_modalias_show(struct device *dev, struct device_attribute *attr, cha
struct acpi_device *acpi_dev = to_acpi_device(dev); struct acpi_device *acpi_dev = to_acpi_device(dev);
int len; int len;
/* Device has no HID and no CID or string is >1024 */
len = create_modalias(acpi_dev, buf, 1024); len = create_modalias(acpi_dev, buf, 1024);
if (len <= 0) if (len <= 0)
return 0; return len;
buf[len++] = '\n'; buf[len++] = '\n';
return len; return len;
} }
...@@ -782,8 +786,8 @@ static int acpi_device_uevent(struct device *dev, struct kobj_uevent_env *env) ...@@ -782,8 +786,8 @@ static int acpi_device_uevent(struct device *dev, struct kobj_uevent_env *env)
return -ENOMEM; return -ENOMEM;
len = create_modalias(acpi_dev, &env->buf[env->buflen - 1], len = create_modalias(acpi_dev, &env->buf[env->buflen - 1],
sizeof(env->buf) - env->buflen); sizeof(env->buf) - env->buflen);
if (len >= (sizeof(env->buf) - env->buflen)) if (len <= 0)
return -ENOMEM; return len;
env->buflen += len; env->buflen += len;
return 0; return 0;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册