[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250624133739.25215-1-listout@listout.xyz>
Date: Tue, 24 Jun 2025 19:07:39 +0530
From: Brahmajit Das <listout@...tout.xyz>
To: linux-hardening@...r.kernel.org,
linux-kernel@...r.kernel.org,
linux-acpi@...r.kernel.org
Cc: rafael@...nel.org,
lenb@...nel.org,
lv.zheng@...el.com,
kees@...nel.org,
rui.zhang@...el.com,
len.brown@...el.com
Subject: [PATCH] ACPI / sysfs: Replace deprecated and unsafe functions with sysfs_emit
acpi/sysfs.c has many instances of unsafe or deprecated functions such
as sprintf, strcpy. This patch relaces them with sysfs_emit to safer
alternavtive and better following of kernel API.
Signed-off-by: Brahmajit Das <listout@...tout.xyz>
---
drivers/acpi/sysfs.c | 87 ++++++++++++++++++++++----------------------
1 file changed, 43 insertions(+), 44 deletions(-)
diff --git a/drivers/acpi/sysfs.c b/drivers/acpi/sysfs.c
index a48ebbf768f9..c3bb7af79fcb 100644
--- a/drivers/acpi/sysfs.c
+++ b/drivers/acpi/sysfs.c
@@ -94,23 +94,23 @@ static int param_get_debug_layer(char *buffer, const struct kernel_param *kp)
int result = 0;
int i;
- result = sprintf(buffer, "%-25s\tHex SET\n", "Description");
+ result = sysfs_emit(buffer, "%-25s\tHex SET\n", "Description");
for (i = 0; i < ARRAY_SIZE(acpi_debug_layers); i++) {
- result += sprintf(buffer + result, "%-25s\t0x%08lX [%c]\n",
+ result += sysfs_emit(buffer + result, "%-25s\t0x%08lX [%c]\n",
acpi_debug_layers[i].name,
acpi_debug_layers[i].value,
(acpi_dbg_layer & acpi_debug_layers[i].value)
? '*' : ' ');
}
result +=
- sprintf(buffer + result, "%-25s\t0x%08X [%c]\n", "ACPI_ALL_DRIVERS",
+ sysfs_emit(buffer + result, "%-25s\t0x%08X [%c]\n", "ACPI_ALL_DRIVERS",
ACPI_ALL_DRIVERS,
(acpi_dbg_layer & ACPI_ALL_DRIVERS) ==
ACPI_ALL_DRIVERS ? '*' : (acpi_dbg_layer & ACPI_ALL_DRIVERS)
== 0 ? ' ' : '-');
result +=
- sprintf(buffer + result,
+ sysfs_emit(buffer + result,
"--\ndebug_layer = 0x%08X ( * = enabled)\n",
acpi_dbg_layer);
@@ -122,17 +122,17 @@ static int param_get_debug_level(char *buffer, const struct kernel_param *kp)
int result = 0;
int i;
- result = sprintf(buffer, "%-25s\tHex SET\n", "Description");
+ result = sysfs_emit(buffer, "%-25s\tHex SET\n", "Description");
for (i = 0; i < ARRAY_SIZE(acpi_debug_levels); i++) {
- result += sprintf(buffer + result, "%-25s\t0x%08lX [%c]\n",
+ result += sysfs_emit(buffer + result, "%-25s\t0x%08lX [%c]\n",
acpi_debug_levels[i].name,
acpi_debug_levels[i].value,
(acpi_dbg_level & acpi_debug_levels[i].value)
? '*' : ' ');
}
result +=
- sprintf(buffer + result, "--\ndebug_level = 0x%08X (* = enabled)\n",
+ sysfs_emit(buffer + result, "--\ndebug_level = 0x%08X (* = enabled)\n",
acpi_dbg_level);
return result;
@@ -181,11 +181,11 @@ static int param_set_trace_method_name(const char *val,
/* This is a hack. We can't kmalloc in early boot. */
if (is_abs_path)
- strcpy(trace_method_name, val);
+ sysfs_emit(trace_method_name, "%s", val);
else {
- trace_method_name[0] = '\\';
- strcpy(trace_method_name+1, val);
+ sysfs_emit(trace_method_name, "\%s", val);
}
+ pr_info("tracepoint: %s", trace_method_name);
/* Restore the original tracer state */
(void)acpi_debug_trace(trace_method_name,
@@ -255,13 +255,13 @@ static int param_set_trace_state(const char *val,
static int param_get_trace_state(char *buffer, const struct kernel_param *kp)
{
if (!(acpi_gbl_trace_flags & ACPI_TRACE_ENABLED))
- return sprintf(buffer, "disable\n");
+ return sysfs_emit(buffer, "disable\n");
if (!acpi_gbl_trace_method_name)
- return sprintf(buffer, "enable\n");
+ return sysfs_emit(buffer, "enable\n");
if (acpi_gbl_trace_flags & ACPI_TRACE_ONESHOT)
- return sprintf(buffer, "method-once\n");
+ return sysfs_emit(buffer, "method-once\n");
else
- return sprintf(buffer, "method\n");
+ return sysfs_emit(buffer, "method\n");
}
module_param_call(trace_state, param_set_trace_state, param_get_trace_state,
@@ -282,7 +282,7 @@ static int param_get_acpica_version(char *buffer,
{
int result;
- result = sprintf(buffer, "%x\n", ACPI_CA_VERSION);
+ result = sysfs_emit(buffer, "%x\n", ACPI_CA_VERSION);
return result;
}
@@ -366,9 +366,8 @@ static int acpi_table_attr_init(struct kobject *tables_obj,
if (table_attr->instance > 1 || (table_attr->instance == 1 &&
!acpi_get_table
(table_header->signature, 2, &header))) {
- snprintf(instance_str, sizeof(instance_str), "%u",
- table_attr->instance);
- strcat(table_attr->filename, instance_str);
+ sysfs_emit(instance_str, "%u%s", table_attr->instance,
+ table_attr->filename);
}
table_attr->attr.size = table_header->length;
@@ -687,7 +686,7 @@ static ssize_t counter_show(struct kobject *kobj,
acpi_irq_not_handled;
all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_GPE].count =
acpi_gpe_count;
- size = sprintf(buf, "%8u", all_counters[index].count);
+ size = sysfs_emit(buf, "%8u", all_counters[index].count);
/* "gpe_all" or "sci" */
if (index >= num_gpes + ACPI_NUM_FIXED_EVENTS)
@@ -698,29 +697,29 @@ static ssize_t counter_show(struct kobject *kobj,
goto end;
if (status & ACPI_EVENT_FLAG_ENABLE_SET)
- size += sprintf(buf + size, " EN");
+ size += sysfs_emit(buf + size, " EN");
else
- size += sprintf(buf + size, " ");
+ size += sysfs_emit(buf + size, " ");
if (status & ACPI_EVENT_FLAG_STATUS_SET)
- size += sprintf(buf + size, " STS");
+ size += sysfs_emit(buf + size, " STS");
else
- size += sprintf(buf + size, " ");
+ size += sysfs_emit(buf + size, " ");
if (!(status & ACPI_EVENT_FLAG_HAS_HANDLER))
- size += sprintf(buf + size, " invalid ");
+ size += sysfs_emit(buf + size, " invalid ");
else if (status & ACPI_EVENT_FLAG_ENABLED)
- size += sprintf(buf + size, " enabled ");
+ size += sysfs_emit(buf + size, " enabled ");
else if (status & ACPI_EVENT_FLAG_WAKE_ENABLED)
- size += sprintf(buf + size, " wake_enabled");
+ size += sysfs_emit(buf + size, " wake_enabled");
else
- size += sprintf(buf + size, " disabled ");
+ size += sysfs_emit(buf + size, " disabled ");
if (status & ACPI_EVENT_FLAG_MASKED)
- size += sprintf(buf + size, " masked ");
+ size += sysfs_emit(buf + size, " masked ");
else
- size += sprintf(buf + size, " unmasked");
+ size += sysfs_emit(buf + size, " unmasked");
end:
- size += sprintf(buf + size, "\n");
+ size += sysfs_emit(buf + size, "\n");
return result ? result : size;
}
@@ -885,27 +884,27 @@ void acpi_irq_stats_init(void)
char *name;
if (i < num_gpes)
- sprintf(buffer, "gpe%02X", i);
+ sysfs_emit(buffer, "gpe%02X", i);
else if (i == num_gpes + ACPI_EVENT_PMTIMER)
- sprintf(buffer, "ff_pmtimer");
+ sysfs_emit(buffer, "ff_pmtimer");
else if (i == num_gpes + ACPI_EVENT_GLOBAL)
- sprintf(buffer, "ff_gbl_lock");
+ sysfs_emit(buffer, "ff_gbl_lock");
else if (i == num_gpes + ACPI_EVENT_POWER_BUTTON)
- sprintf(buffer, "ff_pwr_btn");
+ sysfs_emit(buffer, "ff_pwr_btn");
else if (i == num_gpes + ACPI_EVENT_SLEEP_BUTTON)
- sprintf(buffer, "ff_slp_btn");
+ sysfs_emit(buffer, "ff_slp_btn");
else if (i == num_gpes + ACPI_EVENT_RTC)
- sprintf(buffer, "ff_rt_clk");
+ sysfs_emit(buffer, "ff_rt_clk");
else if (i == num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_GPE)
- sprintf(buffer, "gpe_all");
+ sysfs_emit(buffer, "gpe_all");
else if (i == num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI)
- sprintf(buffer, "sci");
+ sysfs_emit(buffer, "sci");
else if (i == num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI_NOT)
- sprintf(buffer, "sci_not");
+ sysfs_emit(buffer, "sci_not");
else if (i == num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_ERROR)
- sprintf(buffer, "error");
+ sysfs_emit(buffer, "error");
else
- sprintf(buffer, "bug%02X", i);
+ sysfs_emit(buffer, "bug%02X", i);
name = kstrdup(buffer, GFP_KERNEL);
if (name == NULL)
@@ -937,7 +936,7 @@ static void __exit interrupt_stats_exit(void)
static ssize_t pm_profile_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{
- return sprintf(buf, "%d\n", acpi_gbl_FADT.preferred_profile);
+ return sysfs_emit(buf, "%d\n", acpi_gbl_FADT.preferred_profile);
}
static const struct kobj_attribute pm_profile_attr = __ATTR_RO(pm_profile);
@@ -946,7 +945,7 @@ static ssize_t enabled_show(struct kobject *kobj, struct kobj_attribute *attr, c
{
struct acpi_hotplug_profile *hotplug = to_acpi_hotplug_profile(kobj);
- return sprintf(buf, "%d\n", hotplug->enabled);
+ return sysfs_emit(buf, "%d\n", hotplug->enabled);
}
static ssize_t enabled_store(struct kobject *kobj, struct kobj_attribute *attr,
@@ -1000,7 +999,7 @@ void acpi_sysfs_add_hotplug_profile(struct acpi_hotplug_profile *hotplug,
static ssize_t force_remove_show(struct kobject *kobj,
struct kobj_attribute *attr, char *buf)
{
- return sprintf(buf, "%d\n", 0);
+ return sysfs_emit(buf, "%d\n", 0);
}
static ssize_t force_remove_store(struct kobject *kobj,
--
2.50.0
Powered by blists - more mailing lists