Commit 4feba70a authored by Peter Gruber's avatar Peter Gruber Committed by Len Brown

ACPI: avoid empty file name in sysfs

Since commit bc45b1d3 acpi tables are
allowed to have an empty signature and /sys/firmware/acpi/tables uses the
signature as filename.  Applications using naive recursion through /sys
loop forever.  A possible solution would be: (replacing the zero length
filename with the string "NULL")

http://bugzilla.kernel.org/show_bug.cgi?id=11539Acked-by: default avatarZhang Rui <rui.zhang@intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 49fdf678
...@@ -78,9 +78,15 @@ static ssize_t acpi_table_show(struct kobject *kobj, ...@@ -78,9 +78,15 @@ static ssize_t acpi_table_show(struct kobject *kobj,
container_of(bin_attr, struct acpi_table_attr, attr); container_of(bin_attr, struct acpi_table_attr, attr);
struct acpi_table_header *table_header = NULL; struct acpi_table_header *table_header = NULL;
acpi_status status; acpi_status status;
char name[ACPI_NAME_SIZE];
if (strncmp(table_attr->name, "NULL", 4))
memcpy(name, table_attr->name, ACPI_NAME_SIZE);
else
memcpy(name, "\0\0\0\0", 4);
status = status =
acpi_get_table(table_attr->name, table_attr->instance, acpi_get_table(name, table_attr->instance,
&table_header); &table_header);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
return -ENODEV; return -ENODEV;
...@@ -95,21 +101,24 @@ static void acpi_table_attr_init(struct acpi_table_attr *table_attr, ...@@ -95,21 +101,24 @@ static void acpi_table_attr_init(struct acpi_table_attr *table_attr,
struct acpi_table_header *header = NULL; struct acpi_table_header *header = NULL;
struct acpi_table_attr *attr = NULL; struct acpi_table_attr *attr = NULL;
memcpy(table_attr->name, table_header->signature, ACPI_NAME_SIZE); if (table_header->signature[0] != '\0')
memcpy(table_attr->name, table_header->signature,
ACPI_NAME_SIZE);
else
memcpy(table_attr->name, "NULL", 4);
list_for_each_entry(attr, &acpi_table_attr_list, node) { list_for_each_entry(attr, &acpi_table_attr_list, node) {
if (!memcmp(table_header->signature, attr->name, if (!memcmp(table_attr->name, attr->name, ACPI_NAME_SIZE))
ACPI_NAME_SIZE))
if (table_attr->instance < attr->instance) if (table_attr->instance < attr->instance)
table_attr->instance = attr->instance; table_attr->instance = attr->instance;
} }
table_attr->instance++; table_attr->instance++;
if (table_attr->instance > 1 || (table_attr->instance == 1 && if (table_attr->instance > 1 || (table_attr->instance == 1 &&
!acpi_get_table(table_header-> !acpi_get_table
signature, 2, (table_header->signature, 2, &header)))
&header))) sprintf(table_attr->name + ACPI_NAME_SIZE, "%d",
sprintf(table_attr->name + 4, "%d", table_attr->instance); table_attr->instance);
table_attr->attr.size = 0; table_attr->attr.size = 0;
table_attr->attr.read = acpi_table_show; table_attr->attr.read = acpi_table_show;
......
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