* [PATCH 01/15] modpost: remove incorrect code in do_eisa_entry()
@ 2024-11-19 23:56 Masahiro Yamada
2024-11-19 23:56 ` [PATCH 02/15] modpost: remove unnecessary check in do_acpi_entry() Masahiro Yamada
` (13 more replies)
0 siblings, 14 replies; 16+ messages in thread
From: Masahiro Yamada @ 2024-11-19 23:56 UTC (permalink / raw)
To: linux-kbuild
Cc: Masahiro Yamada, Andreas Schwab, Jean Delvare, Jochen Friedrich,
Michal Marek, Nathan Chancellor, Nicolas Schier, Sam Ravnborg,
linux-kernel
This function contains multiple bugs after the following commits:
- ac551828993e ("modpost: i2c aliases need no trailing wildcard")
- 6543becf26ff ("mod/file2alias: make modalias generation safe for cross compiling")
Commit ac551828993e inserted the following code to do_eisa_entry():
else
strcat(alias, "*");
This is incorrect because 'alias' is uninitialized. If it is not
NULL-terminated, strcat() could cause a buffer overrun.
Even if 'alias' happens to be zero-filled, it would output:
MODULE_ALIAS("*");
This would match anything. As a result, the module could be loaded by
any unrelated uevent from an unrelated subsystem.
Commit ac551828993e introduced another bug.
Prior to that commit, the conditional check was:
if (eisa->sig[0])
This checked if the first character of eisa_device_id::sig was not '\0'.
However, commit ac551828993e changed it as follows:
if (sig[0])
sig[0] is NOT the first character of the eisa_device_id::sig. The
type of 'sig' is 'char (*)[8]', meaning that the type of 'sig[0]' is
'char [8]' instead of 'char'. 'sig[0]' and 'symval' refer to the same
address, which never becomes NULL.
The correct conversion would have been:
if ((*sig)[0])
However, this if-conditional was meaningless because the earlier change
in commit ac551828993e was incorrect.
This commit removes the entire incorrect code, which should never have
been executed.
Fixes: ac551828993e ("modpost: i2c aliases need no trailing wildcard")
Fixes: 6543becf26ff ("mod/file2alias: make modalias generation safe for cross compiling")
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
scripts/mod/file2alias.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index c4cc11aa558f..634e40748287 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -809,10 +809,7 @@ static int do_eisa_entry(const char *filename, void *symval,
char *alias)
{
DEF_FIELD_ADDR(symval, eisa_device_id, sig);
- if (sig[0])
- sprintf(alias, EISA_DEVICE_MODALIAS_FMT "*", *sig);
- else
- strcat(alias, "*");
+ sprintf(alias, EISA_DEVICE_MODALIAS_FMT "*", *sig);
return 1;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 02/15] modpost: remove unnecessary check in do_acpi_entry()
2024-11-19 23:56 [PATCH 01/15] modpost: remove incorrect code in do_eisa_entry() Masahiro Yamada
@ 2024-11-19 23:56 ` Masahiro Yamada
2024-11-19 23:56 ` [PATCH 03/15] modpost: introduce module_alias_printf() helper Masahiro Yamada
` (12 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2024-11-19 23:56 UTC (permalink / raw)
To: linux-kbuild
Cc: Masahiro Yamada, Nathan Chancellor, Nicolas Schier, linux-kernel
The 'id' pointer is never NULL since it has the same address as
'symval'.
Also, checking (*id)[0] is simpler than calling strlen().
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
scripts/mod/file2alias.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index 634e40748287..34678ed40fdb 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -570,7 +570,7 @@ static int do_acpi_entry(const char *filename,
DEF_FIELD(symval, acpi_device_id, cls);
DEF_FIELD(symval, acpi_device_id, cls_msk);
- if (id && strlen((const char *)*id))
+ if ((*id)[0])
sprintf(alias, "acpi*:%s:*", *id);
else {
int i, byte_shift, cnt = 0;
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 03/15] modpost: introduce module_alias_printf() helper
2024-11-19 23:56 [PATCH 01/15] modpost: remove incorrect code in do_eisa_entry() Masahiro Yamada
2024-11-19 23:56 ` [PATCH 02/15] modpost: remove unnecessary check in do_acpi_entry() Masahiro Yamada
@ 2024-11-19 23:56 ` Masahiro Yamada
2024-11-20 2:37 ` Masahiro Yamada
2024-11-19 23:56 ` [PATCH 04/15] modpost: deduplicate MODULE_ALIAS() for all drivers Masahiro Yamada
` (11 subsequent siblings)
13 siblings, 1 reply; 16+ messages in thread
From: Masahiro Yamada @ 2024-11-19 23:56 UTC (permalink / raw)
To: linux-kbuild
Cc: Masahiro Yamada, Nathan Chancellor, Nicolas Schier, linux-kernel
The generic ->do_entry() handler is currently limited to returning
a single alias string.
However, this is not flexible enough for several subsystems, which
currently require their own implementations:
- do_usb_table()
- do_of_table()
- do_pnp_device_entry()
- do_pnp_card_entries()
This commit introduces a helper function so that these special cases can
add multiple MODULE_ALIAS() and then migrate to the generic framework.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
scripts/mod/file2alias.c | 89 +++++++++++++++++++++++++++++-----------
scripts/mod/modpost.c | 11 ++++-
scripts/mod/modpost.h | 19 ++++++++-
3 files changed, 91 insertions(+), 28 deletions(-)
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index 34678ed40fdb..e31619cee05e 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -10,6 +10,12 @@
* of the GNU General Public License, incorporated herein by reference.
*/
+#include <stdarg.h>
+#include <stdio.h>
+
+#include "list.h"
+#include "xalloc.h"
+
#include "modpost.h"
#include "devicetable-offsets.h"
@@ -31,6 +37,56 @@ typedef Elf64_Addr kernel_ulong_t;
#include <ctype.h>
#include <stdbool.h>
+/**
+ * module_alias_printf - add auto-generated MODULE_ALIAS()
+ *
+ * @mod: module
+ * @append_wildcard: append '*' for future extension if not exist yet
+ * @fmt: printf(3)-like format
+ */
+static void __attribute__((format (printf, 3, 4)))
+module_alias_printf(struct module *mod, bool append_wildcard,
+ const char *fmt, ...)
+{
+ struct module_alias *new;
+ size_t len, n;
+ va_list ap;
+
+ /* Determine required size. */
+ va_start(ap, fmt);
+ n = vsnprintf(NULL, 0, fmt, ap);
+ va_end(ap);
+
+ if (n < 0) {
+ error("vsnprintf failed\n");
+ return;
+ }
+
+ len = n + 1; /* extra byte for '\0' */
+
+ if (append_wildcard)
+ len++; /* extra byte for '*' */
+
+ new = xmalloc(sizeof(*new) + len);
+
+ /* Now, really print it to the allocated buffer */
+ va_start(ap, fmt);
+ n = vsnprintf(new->str, len, fmt, ap);
+ va_end(ap);
+
+ if (n < 0) {
+ error("vsnprintf failed\n");
+ return;
+ }
+
+ if (append_wildcard && (n == 0 || new->str[n - 1] != '*')) {
+ new->str[n] = '*';
+ new->str[n + 1] = '\0';
+ }
+
+ list_add_tail(&new->node, &mod->aliases);
+}
+
typedef uint32_t __u32;
typedef uint16_t __u16;
typedef unsigned char __u8;
@@ -229,9 +285,7 @@ static void do_usb_entry(void *symval,
ADD(alias, "in", match_flags&USB_DEVICE_ID_MATCH_INT_NUMBER,
bInterfaceNumber);
- add_wildcard(alias);
- buf_printf(&mod->dev_table_buf,
- "MODULE_ALIAS(\"%s\");\n", alias);
+ module_alias_printf(mod, true, "%s", alias);
}
/* Handles increment/decrement of BCD formatted integers */
@@ -375,10 +429,8 @@ static void do_of_entry_multi(void *symval, struct module *mod)
if (isspace(*tmp))
*tmp = '_';
- buf_printf(&mod->dev_table_buf, "MODULE_ALIAS(\"%s\");\n", alias);
- strcat(alias, "C");
- add_wildcard(alias);
- buf_printf(&mod->dev_table_buf, "MODULE_ALIAS(\"%s\");\n", alias);
+ module_alias_printf(mod, false, "%s", alias);
+ module_alias_printf(mod, false, "%sC*", alias);
}
static void do_of_table(void *symval, unsigned long size,
@@ -608,14 +660,12 @@ static void do_pnp_device_entry(void *symval, unsigned long size,
char acpi_id[sizeof(*id)];
int j;
- buf_printf(&mod->dev_table_buf,
- "MODULE_ALIAS(\"pnp:d%s*\");\n", *id);
+ module_alias_printf(mod, false, "pnp:d%s*", *id);
/* fix broken pnp bus lowercasing */
for (j = 0; j < sizeof(acpi_id); j++)
acpi_id[j] = toupper((*id)[j]);
- buf_printf(&mod->dev_table_buf,
- "MODULE_ALIAS(\"acpi*:%s:*\");\n", acpi_id);
+ module_alias_printf(mod, false, "acpi*:%s:*", acpi_id);
}
}
@@ -666,14 +716,12 @@ static void do_pnp_card_entries(void *symval, unsigned long size,
char acpi_id[PNP_ID_LEN];
int k;
- buf_printf(&mod->dev_table_buf,
- "MODULE_ALIAS(\"pnp:d%s*\");\n", id);
+ module_alias_printf(mod, false, "pnp:d%s*", id);
/* fix broken pnp bus lowercasing */
for (k = 0; k < sizeof(acpi_id); k++)
acpi_id[k] = toupper(id[k]);
- buf_printf(&mod->dev_table_buf,
- "MODULE_ALIAS(\"acpi*:%s:*\");\n", acpi_id);
+ module_alias_printf(mod, false, "acpi*:%s:*", acpi_id);
}
}
}
@@ -1534,8 +1582,7 @@ static void do_table(void *symval, unsigned long size,
for (i = 0; i < size; i += id_size) {
if (do_entry(mod->name, symval+i, alias)) {
- buf_printf(&mod->dev_table_buf,
- "MODULE_ALIAS(\"%s\");\n", alias);
+ module_alias_printf(mod, false, "%s", alias);
}
}
}
@@ -1660,11 +1707,3 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
}
free(zeros);
}
-
-/* Now add out buffered information to the generated C source */
-void add_moddevtable(struct buffer *buf, struct module *mod)
-{
- buf_printf(buf, "\n");
- buf_write(buf, mod->dev_table_buf.p, mod->dev_table_buf.pos);
- free(mod->dev_table_buf.p);
-}
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 107393a8c48a..1948d69ce2b9 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -176,6 +176,7 @@ static struct module *new_module(const char *name, size_t namelen)
INIT_LIST_HEAD(&mod->unresolved_symbols);
INIT_LIST_HEAD(&mod->missing_namespaces);
INIT_LIST_HEAD(&mod->imported_namespaces);
+ INIT_LIST_HEAD(&mod->aliases);
memcpy(mod->name, name, namelen);
mod->name[namelen] = '\0';
@@ -1966,6 +1967,7 @@ static void write_vmlinux_export_c_file(struct module *mod)
static void write_mod_c_file(struct module *mod)
{
struct buffer buf = { };
+ struct module_alias *alias, *next;
char fname[PATH_MAX];
int ret;
@@ -1973,7 +1975,14 @@ static void write_mod_c_file(struct module *mod)
add_exported_symbols(&buf, mod);
add_versions(&buf, mod);
add_depends(&buf, mod);
- add_moddevtable(&buf, mod);
+
+ buf_printf(&buf, "\n");
+ list_for_each_entry_safe(alias, next, &mod->aliases, node) {
+ buf_printf(&buf, "MODULE_ALIAS(\"%s\");\n", alias->str);
+ list_del(&alias->node);
+ free(alias);
+ }
+
add_srcversion(&buf, mod);
ret = snprintf(fname, sizeof(fname), "%s.mod.c", mod->name);
diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h
index ada3a36cc4bc..52efe0026b34 100644
--- a/scripts/mod/modpost.h
+++ b/scripts/mod/modpost.h
@@ -79,6 +79,22 @@ buf_printf(struct buffer *buf, const char *fmt, ...);
void
buf_write(struct buffer *buf, const char *s, int len);
+/**
+ * struct module_alias - auto-generated MODULE_ALIAS()
+ *
+ * @node: linked to module::aliases
+ * @str: a string for MODULE_ALIAS()
+ */
+struct module_alias {
+ struct list_head node;
+ char str[];
+};
+
+/**
+ * struct module - represent a module (vmlinux or *.ko)
+ *
+ * @aliases: list head for module_aliases
+ */
struct module {
struct list_head list;
struct list_head exported_symbols;
@@ -89,12 +105,12 @@ struct module {
bool seen;
bool has_init;
bool has_cleanup;
- struct buffer dev_table_buf;
char srcversion[25];
// Missing namespace dependencies
struct list_head missing_namespaces;
// Actual imported namespaces
struct list_head imported_namespaces;
+ struct list_head aliases;
char name[];
};
@@ -170,7 +186,6 @@ Elf_Sym *symsearch_find_nearest(struct elf_info *elf, Elf_Addr addr,
/* file2alias.c */
void handle_moddevtable(struct module *mod, struct elf_info *info,
Elf_Sym *sym, const char *symname);
-void add_moddevtable(struct buffer *buf, struct module *mod);
/* sumversion.c */
void get_src_version(const char *modname, char sum[], unsigned sumlen);
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 04/15] modpost: deduplicate MODULE_ALIAS() for all drivers
2024-11-19 23:56 [PATCH 01/15] modpost: remove incorrect code in do_eisa_entry() Masahiro Yamada
2024-11-19 23:56 ` [PATCH 02/15] modpost: remove unnecessary check in do_acpi_entry() Masahiro Yamada
2024-11-19 23:56 ` [PATCH 03/15] modpost: introduce module_alias_printf() helper Masahiro Yamada
@ 2024-11-19 23:56 ` Masahiro Yamada
2024-11-19 23:56 ` [PATCH 05/15] modpost: remove DEF_FIELD_ADDR_VAR() macro Masahiro Yamada
` (10 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2024-11-19 23:56 UTC (permalink / raw)
To: linux-kbuild
Cc: Masahiro Yamada, Nathan Chancellor, Nicolas Schier, linux-kernel
MODULE_DEVICE_TABLE(pnp_card, ...) may have duplicated IDs. For
instance, snd_ad1816a_pnpids[] in sound/isa/ad1816a/ad1816a.c includes
multiple occurrences of the "ADS7180" string within its .devs fields.
Currently, do_pnp_card_entries() handles deduplication on its own, but
this logic should be moved to a common helper function, as drivers in
other subsystems might also have similar duplication issues.
For example, drivers/media/i2c/s5c73m3/s5c73m3.mod.c contains duplicated
MODULE_ALIAS() entries because both s5c73m3-core.c and s5c73m3-spi.c
define the same compatible string.
This commit eliminates redundant MODULE_ALIAS() entries across all
drivers.
[Before]
$ grep MODULE_ALIAS drivers/media/i2c/s5c73m3/s5c73m3.mod.c
MODULE_ALIAS("i2c:S5C73M3");
MODULE_ALIAS("of:N*T*Csamsung,s5c73m3");
MODULE_ALIAS("of:N*T*Csamsung,s5c73m3C*");
MODULE_ALIAS("of:N*T*Csamsung,s5c73m3");
MODULE_ALIAS("of:N*T*Csamsung,s5c73m3C*");
[After]
$ grep MODULE_ALIAS drivers/media/i2c/s5c73m3/s5c73m3.mod.c
MODULE_ALIAS("i2c:S5C73M3");
MODULE_ALIAS("of:N*T*Csamsung,s5c73m3");
MODULE_ALIAS("of:N*T*Csamsung,s5c73m3C*");
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
scripts/mod/file2alias.c | 48 +++++++++++++---------------------------
1 file changed, 15 insertions(+), 33 deletions(-)
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index e31619cee05e..57bd4e8da8d5 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -48,7 +48,7 @@ static void __attribute__((format (printf, 3, 4)))
module_alias_printf(struct module *mod, bool append_wildcard,
const char *fmt, ...)
{
- struct module_alias *new;
+ struct module_alias *new, *als;
size_t len, n;
va_list ap;
@@ -84,6 +84,14 @@ module_alias_printf(struct module *mod, bool append_wildcard,
new->str[n + 1] = '\0';
}
+ /* avoid duplication */
+ list_for_each_entry(als, &mod->aliases, node) {
+ if (!strcmp(als->str, new->str)) {
+ free(new);
+ return;
+ }
+ }
+
list_add_tail(&new->node, &mod->aliases);
}
@@ -685,44 +693,18 @@ static void do_pnp_card_entries(void *symval, unsigned long size,
for (j = 0; j < PNP_MAX_DEVICES; j++) {
const char *id = (char *)(*devs)[j].id;
- int i2, j2;
- int dup = 0;
+ char acpi_id[PNP_ID_LEN];
if (!id[0])
break;
- /* find duplicate, already added value */
- for (i2 = 0; i2 < i && !dup; i2++) {
- DEF_FIELD_ADDR_VAR(symval + i2 * id_size,
- pnp_card_device_id,
- devs, devs_dup);
-
- for (j2 = 0; j2 < PNP_MAX_DEVICES; j2++) {
- const char *id2 =
- (char *)(*devs_dup)[j2].id;
-
- if (!id2[0])
- break;
-
- if (!strcmp(id, id2)) {
- dup = 1;
- break;
- }
- }
- }
-
/* add an individual alias for every device entry */
- if (!dup) {
- char acpi_id[PNP_ID_LEN];
- int k;
+ module_alias_printf(mod, false, "pnp:d%s*", id);
- module_alias_printf(mod, false, "pnp:d%s*", id);
-
- /* fix broken pnp bus lowercasing */
- for (k = 0; k < sizeof(acpi_id); k++)
- acpi_id[k] = toupper(id[k]);
- module_alias_printf(mod, false, "acpi*:%s:*", acpi_id);
- }
+ /* fix broken pnp bus lowercasing */
+ for (int k = 0; k < sizeof(acpi_id); k++)
+ acpi_id[k] = toupper(id[k]);
+ module_alias_printf(mod, false, "acpi*:%s:*", acpi_id);
}
}
}
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 05/15] modpost: remove DEF_FIELD_ADDR_VAR() macro
2024-11-19 23:56 [PATCH 01/15] modpost: remove incorrect code in do_eisa_entry() Masahiro Yamada
` (2 preceding siblings ...)
2024-11-19 23:56 ` [PATCH 04/15] modpost: deduplicate MODULE_ALIAS() for all drivers Masahiro Yamada
@ 2024-11-19 23:56 ` Masahiro Yamada
2024-11-19 23:56 ` [PATCH 06/15] modpost: pass (struct module *) to do_*_entry() functions Masahiro Yamada
` (9 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2024-11-19 23:56 UTC (permalink / raw)
To: linux-kbuild
Cc: Masahiro Yamada, Nathan Chancellor, Nicolas Schier, linux-kernel
With the former cleanups in do_pnp_card_entries(), this macro is no
longer used by anyone.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
scripts/mod/file2alias.c | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index 57bd4e8da8d5..d34cf418ba70 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -136,19 +136,12 @@ struct devtable {
#define DEF_FIELD(m, devid, f) \
typeof(((struct devid *)0)->f) f = TO_NATIVE(*(typeof(f) *)((m) + OFF_##devid##_##f))
-/* Define a variable v that holds the address of field f of struct devid
- * based at address m. Due to the way typeof works, for a field of type
- * T[N] the variable has type T(*)[N], _not_ T*.
- */
-#define DEF_FIELD_ADDR_VAR(m, devid, f, v) \
- typeof(((struct devid *)0)->f) *v = ((m) + OFF_##devid##_##f)
-
/* Define a variable f that holds the address of field f of struct devid
* based at address m. Due to the way typeof works, for a field of type
* T[N] the variable has type T(*)[N], _not_ T*.
*/
#define DEF_FIELD_ADDR(m, devid, f) \
- DEF_FIELD_ADDR_VAR(m, devid, f, f)
+ typeof(((struct devid *)0)->f) *f = ((m) + OFF_##devid##_##f)
#define ADD(str, sep, cond, field) \
do { \
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 06/15] modpost: pass (struct module *) to do_*_entry() functions
2024-11-19 23:56 [PATCH 01/15] modpost: remove incorrect code in do_eisa_entry() Masahiro Yamada
` (3 preceding siblings ...)
2024-11-19 23:56 ` [PATCH 05/15] modpost: remove DEF_FIELD_ADDR_VAR() macro Masahiro Yamada
@ 2024-11-19 23:56 ` Masahiro Yamada
2024-11-19 23:56 ` [PATCH 07/15] modpost: call module_alias_printf() from all " Masahiro Yamada
` (8 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2024-11-19 23:56 UTC (permalink / raw)
To: linux-kbuild
Cc: Masahiro Yamada, Nathan Chancellor, Nicolas Schier, linux-kernel
Replace the first argument with a pointer to struct module.
'filename' can be replaced with mod->name.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
scripts/mod/file2alias.c | 118 +++++++++++++++++++--------------------
1 file changed, 59 insertions(+), 59 deletions(-)
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index d34cf418ba70..57385cdfd773 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -124,7 +124,7 @@ typedef struct {
struct devtable {
const char *device_id; /* name of table, __mod_<name>__*_device_table. */
unsigned long id_size;
- int (*do_entry)(const char *filename, void *symval, char *alias);
+ int (*do_entry)(struct module *mod, void *symval, char *alias);
};
/* Size of alias provided to do_entry functions */
@@ -450,7 +450,7 @@ static void do_of_table(void *symval, unsigned long size,
}
/* Looks like: hid:bNvNpN */
-static int do_hid_entry(const char *filename,
+static int do_hid_entry(struct module *mod,
void *symval, char *alias)
{
DEF_FIELD(symval, hid_device_id, bus);
@@ -468,7 +468,7 @@ static int do_hid_entry(const char *filename,
}
/* Looks like: ieee1394:venNmoNspNverN */
-static int do_ieee1394_entry(const char *filename,
+static int do_ieee1394_entry(struct module *mod,
void *symval, char *alias)
{
DEF_FIELD(symval, ieee1394_device_id, match_flags);
@@ -492,7 +492,7 @@ static int do_ieee1394_entry(const char *filename,
}
/* Looks like: pci:vNdNsvNsdNbcNscNiN or <prefix>_pci:vNdNsvNsdNbcNscNiN. */
-static int do_pci_entry(const char *filename,
+static int do_pci_entry(struct module *mod,
void *symval, char *alias)
{
/* Class field can be divided into these three. */
@@ -536,7 +536,7 @@ static int do_pci_entry(const char *filename,
|| (subclass_mask != 0 && subclass_mask != 0xFF)
|| (interface_mask != 0 && interface_mask != 0xFF)) {
warn("Can't handle masks in %s:%04X\n",
- filename, class_mask);
+ mod->name, class_mask);
return 0;
}
@@ -548,7 +548,7 @@ static int do_pci_entry(const char *filename,
}
/* looks like: "ccw:tNmNdtNdmN" */
-static int do_ccw_entry(const char *filename,
+static int do_ccw_entry(struct module *mod,
void *symval, char *alias)
{
DEF_FIELD(symval, ccw_device_id, match_flags);
@@ -571,7 +571,7 @@ static int do_ccw_entry(const char *filename,
}
/* looks like: "ap:tN" */
-static int do_ap_entry(const char *filename,
+static int do_ap_entry(struct module *mod,
void *symval, char *alias)
{
DEF_FIELD(symval, ap_device_id, dev_type);
@@ -581,7 +581,7 @@ static int do_ap_entry(const char *filename,
}
/* looks like: "css:tN" */
-static int do_css_entry(const char *filename,
+static int do_css_entry(struct module *mod,
void *symval, char *alias)
{
DEF_FIELD(symval, css_device_id, type);
@@ -591,7 +591,7 @@ static int do_css_entry(const char *filename,
}
/* Looks like: "serio:tyNprNidNexN" */
-static int do_serio_entry(const char *filename,
+static int do_serio_entry(struct module *mod,
void *symval, char *alias)
{
DEF_FIELD(symval, serio_device_id, type);
@@ -616,7 +616,7 @@ static int do_serio_entry(const char *filename,
* or _CLS. Also, bb, ss, and pp can be substituted with ??
* as don't care byte.
*/
-static int do_acpi_entry(const char *filename,
+static int do_acpi_entry(struct module *mod,
void *symval, char *alias)
{
DEF_FIELD_ADDR(symval, acpi_device_id, id);
@@ -703,7 +703,7 @@ static void do_pnp_card_entries(void *symval, unsigned long size,
}
/* Looks like: pcmcia:mNcNfNfnNpfnNvaNvbNvcNvdN. */
-static int do_pcmcia_entry(const char *filename,
+static int do_pcmcia_entry(struct module *mod,
void *symval, char *alias)
{
unsigned int i;
@@ -739,7 +739,7 @@ static int do_pcmcia_entry(const char *filename,
return 1;
}
-static int do_vio_entry(const char *filename, void *symval,
+static int do_vio_entry(struct module *mod, void *symval,
char *alias)
{
char *tmp;
@@ -771,7 +771,7 @@ static void do_input(char *alias,
}
/* input:b0v0p0e0-eXkXrXaXmXlXsXfXwX where X is comma-separated %02X. */
-static int do_input_entry(const char *filename, void *symval,
+static int do_input_entry(struct module *mod, void *symval,
char *alias)
{
DEF_FIELD(symval, input_device_id, flags);
@@ -828,7 +828,7 @@ static int do_input_entry(const char *filename, void *symval,
return 1;
}
-static int do_eisa_entry(const char *filename, void *symval,
+static int do_eisa_entry(struct module *mod, void *symval,
char *alias)
{
DEF_FIELD_ADDR(symval, eisa_device_id, sig);
@@ -837,7 +837,7 @@ static int do_eisa_entry(const char *filename, void *symval,
}
/* Looks like: parisc:tNhvNrevNsvN */
-static int do_parisc_entry(const char *filename, void *symval,
+static int do_parisc_entry(struct module *mod, void *symval,
char *alias)
{
DEF_FIELD(symval, parisc_device_id, hw_type);
@@ -856,7 +856,7 @@ static int do_parisc_entry(const char *filename, void *symval,
}
/* Looks like: sdio:cNvNdN. */
-static int do_sdio_entry(const char *filename,
+static int do_sdio_entry(struct module *mod,
void *symval, char *alias)
{
DEF_FIELD(symval, sdio_device_id, class);
@@ -872,7 +872,7 @@ static int do_sdio_entry(const char *filename,
}
/* Looks like: ssb:vNidNrevN. */
-static int do_ssb_entry(const char *filename,
+static int do_ssb_entry(struct module *mod,
void *symval, char *alias)
{
DEF_FIELD(symval, ssb_device_id, vendor);
@@ -888,7 +888,7 @@ static int do_ssb_entry(const char *filename,
}
/* Looks like: bcma:mNidNrevNclN. */
-static int do_bcma_entry(const char *filename,
+static int do_bcma_entry(struct module *mod,
void *symval, char *alias)
{
DEF_FIELD(symval, bcma_device_id, manuf);
@@ -906,7 +906,7 @@ static int do_bcma_entry(const char *filename,
}
/* Looks like: virtio:dNvN */
-static int do_virtio_entry(const char *filename, void *symval,
+static int do_virtio_entry(struct module *mod, void *symval,
char *alias)
{
DEF_FIELD(symval, virtio_device_id, device);
@@ -926,7 +926,7 @@ static int do_virtio_entry(const char *filename, void *symval,
* in the name.
*/
-static int do_vmbus_entry(const char *filename, void *symval,
+static int do_vmbus_entry(struct module *mod, void *symval,
char *alias)
{
int i;
@@ -943,7 +943,7 @@ static int do_vmbus_entry(const char *filename, void *symval,
}
/* Looks like: rpmsg:S */
-static int do_rpmsg_entry(const char *filename, void *symval,
+static int do_rpmsg_entry(struct module *mod, void *symval,
char *alias)
{
DEF_FIELD_ADDR(symval, rpmsg_device_id, name);
@@ -953,7 +953,7 @@ static int do_rpmsg_entry(const char *filename, void *symval,
}
/* Looks like: i2c:S */
-static int do_i2c_entry(const char *filename, void *symval,
+static int do_i2c_entry(struct module *mod, void *symval,
char *alias)
{
DEF_FIELD_ADDR(symval, i2c_device_id, name);
@@ -962,7 +962,7 @@ static int do_i2c_entry(const char *filename, void *symval,
return 1;
}
-static int do_i3c_entry(const char *filename, void *symval,
+static int do_i3c_entry(struct module *mod, void *symval,
char *alias)
{
DEF_FIELD(symval, i3c_device_id, match_flags);
@@ -980,7 +980,7 @@ static int do_i3c_entry(const char *filename, void *symval,
return 1;
}
-static int do_slim_entry(const char *filename, void *symval, char *alias)
+static int do_slim_entry(struct module *mod, void *symval, char *alias)
{
DEF_FIELD(symval, slim_device_id, manf_id);
DEF_FIELD(symval, slim_device_id, prod_code);
@@ -991,7 +991,7 @@ static int do_slim_entry(const char *filename, void *symval, char *alias)
}
/* Looks like: spi:S */
-static int do_spi_entry(const char *filename, void *symval,
+static int do_spi_entry(struct module *mod, void *symval,
char *alias)
{
DEF_FIELD_ADDR(symval, spi_device_id, name);
@@ -1032,7 +1032,7 @@ static void dmi_ascii_filter(char *d, const char *s)
}
-static int do_dmi_entry(const char *filename, void *symval,
+static int do_dmi_entry(struct module *mod, void *symval,
char *alias)
{
int i, j;
@@ -1056,7 +1056,7 @@ static int do_dmi_entry(const char *filename, void *symval,
return 1;
}
-static int do_platform_entry(const char *filename,
+static int do_platform_entry(struct module *mod,
void *symval, char *alias)
{
DEF_FIELD_ADDR(symval, platform_device_id, name);
@@ -1064,7 +1064,7 @@ static int do_platform_entry(const char *filename,
return 1;
}
-static int do_mdio_entry(const char *filename,
+static int do_mdio_entry(struct module *mod,
void *symval, char *alias)
{
int i;
@@ -1089,7 +1089,7 @@ static int do_mdio_entry(const char *filename,
}
/* Looks like: zorro:iN. */
-static int do_zorro_entry(const char *filename, void *symval,
+static int do_zorro_entry(struct module *mod, void *symval,
char *alias)
{
DEF_FIELD(symval, zorro_device_id, id);
@@ -1099,7 +1099,7 @@ static int do_zorro_entry(const char *filename, void *symval,
}
/* looks like: "pnp:dD" */
-static int do_isapnp_entry(const char *filename,
+static int do_isapnp_entry(struct module *mod,
void *symval, char *alias)
{
DEF_FIELD(symval, isapnp_device_id, vendor);
@@ -1114,7 +1114,7 @@ static int do_isapnp_entry(const char *filename,
}
/* Looks like: "ipack:fNvNdN". */
-static int do_ipack_entry(const char *filename,
+static int do_ipack_entry(struct module *mod,
void *symval, char *alias)
{
DEF_FIELD(symval, ipack_device_id, format);
@@ -1176,7 +1176,7 @@ static void append_nibble_mask(char **outp,
* N is exactly 8 digits, where each is an upper-case hex digit, or
* a ? or [] pattern matching exactly one digit.
*/
-static int do_amba_entry(const char *filename,
+static int do_amba_entry(struct module *mod,
void *symval, char *alias)
{
unsigned int digit;
@@ -1186,7 +1186,7 @@ static int do_amba_entry(const char *filename,
if ((id & mask) != id)
fatal("%s: Masked-off bit(s) of AMBA device ID are non-zero: id=0x%08X, mask=0x%08X. Please fix this driver.\n",
- filename, id, mask);
+ mod->name, id, mask);
p += sprintf(alias, "amba:d");
for (digit = 0; digit < 8; digit++)
@@ -1203,7 +1203,7 @@ static int do_amba_entry(const char *filename,
* N is exactly 2 digits, where each is an upper-case hex digit, or
* a ? or [] pattern matching exactly one digit.
*/
-static int do_mips_cdmm_entry(const char *filename,
+static int do_mips_cdmm_entry(struct module *mod,
void *symval, char *alias)
{
DEF_FIELD(symval, mips_cdmm_device_id, type);
@@ -1218,7 +1218,7 @@ static int do_mips_cdmm_entry(const char *filename,
* complicated.
*/
-static int do_x86cpu_entry(const char *filename, void *symval,
+static int do_x86cpu_entry(struct module *mod, void *symval,
char *alias)
{
DEF_FIELD(symval, x86_cpu_id, feature);
@@ -1237,7 +1237,7 @@ static int do_x86cpu_entry(const char *filename, void *symval,
}
/* LOOKS like cpu:type:*:feature:*FEAT* */
-static int do_cpu_entry(const char *filename, void *symval, char *alias)
+static int do_cpu_entry(struct module *mod, void *symval, char *alias)
{
DEF_FIELD(symval, cpu_feature, feature);
@@ -1246,7 +1246,7 @@ static int do_cpu_entry(const char *filename, void *symval, char *alias)
}
/* Looks like: mei:S:uuid:N:* */
-static int do_mei_entry(const char *filename, void *symval,
+static int do_mei_entry(struct module *mod, void *symval,
char *alias)
{
DEF_FIELD_ADDR(symval, mei_cl_device_id, name);
@@ -1264,7 +1264,7 @@ static int do_mei_entry(const char *filename, void *symval,
}
/* Looks like: rapidio:vNdNavNadN */
-static int do_rio_entry(const char *filename,
+static int do_rio_entry(struct module *mod,
void *symval, char *alias)
{
DEF_FIELD(symval, rio_device_id, did);
@@ -1283,7 +1283,7 @@ static int do_rio_entry(const char *filename,
}
/* Looks like: ulpi:vNpN */
-static int do_ulpi_entry(const char *filename, void *symval,
+static int do_ulpi_entry(struct module *mod, void *symval,
char *alias)
{
DEF_FIELD(symval, ulpi_device_id, vendor);
@@ -1295,7 +1295,7 @@ static int do_ulpi_entry(const char *filename, void *symval,
}
/* Looks like: hdaudio:vNrNaN */
-static int do_hda_entry(const char *filename, void *symval, char *alias)
+static int do_hda_entry(struct module *mod, void *symval, char *alias)
{
DEF_FIELD(symval, hda_device_id, vendor_id);
DEF_FIELD(symval, hda_device_id, rev_id);
@@ -1311,7 +1311,7 @@ static int do_hda_entry(const char *filename, void *symval, char *alias)
}
/* Looks like: sdw:mNpNvNcN */
-static int do_sdw_entry(const char *filename, void *symval, char *alias)
+static int do_sdw_entry(struct module *mod, void *symval, char *alias)
{
DEF_FIELD(symval, sdw_device_id, mfg_id);
DEF_FIELD(symval, sdw_device_id, part_id);
@@ -1329,7 +1329,7 @@ static int do_sdw_entry(const char *filename, void *symval, char *alias)
}
/* Looks like: fsl-mc:vNdN */
-static int do_fsl_mc_entry(const char *filename, void *symval,
+static int do_fsl_mc_entry(struct module *mod, void *symval,
char *alias)
{
DEF_FIELD(symval, fsl_mc_device_id, vendor);
@@ -1340,7 +1340,7 @@ static int do_fsl_mc_entry(const char *filename, void *symval,
}
/* Looks like: tbsvc:kSpNvNrN */
-static int do_tbsvc_entry(const char *filename, void *symval, char *alias)
+static int do_tbsvc_entry(struct module *mod, void *symval, char *alias)
{
DEF_FIELD(symval, tb_service_id, match_flags);
DEF_FIELD_ADDR(symval, tb_service_id, protocol_key);
@@ -1364,7 +1364,7 @@ static int do_tbsvc_entry(const char *filename, void *symval, char *alias)
}
/* Looks like: typec:idNmN */
-static int do_typec_entry(const char *filename, void *symval, char *alias)
+static int do_typec_entry(struct module *mod, void *symval, char *alias)
{
DEF_FIELD(symval, typec_device_id, svid);
DEF_FIELD(symval, typec_device_id, mode);
@@ -1376,7 +1376,7 @@ static int do_typec_entry(const char *filename, void *symval, char *alias)
}
/* Looks like: tee:uuid */
-static int do_tee_entry(const char *filename, void *symval, char *alias)
+static int do_tee_entry(struct module *mod, void *symval, char *alias)
{
DEF_FIELD_ADDR(symval, tee_client_device_id, uuid);
@@ -1391,28 +1391,28 @@ static int do_tee_entry(const char *filename, void *symval, char *alias)
}
/* Looks like: wmi:guid */
-static int do_wmi_entry(const char *filename, void *symval, char *alias)
+static int do_wmi_entry(struct module *mod, void *symval, char *alias)
{
int len;
DEF_FIELD_ADDR(symval, wmi_device_id, guid_string);
if (strlen(*guid_string) != UUID_STRING_LEN) {
warn("Invalid WMI device id 'wmi:%s' in '%s'\n",
- *guid_string, filename);
+ *guid_string, mod->name);
return 0;
}
len = snprintf(alias, ALIAS_SIZE, WMI_MODULE_PREFIX "%s", *guid_string);
if (len < 0 || len >= ALIAS_SIZE) {
warn("Could not generate all MODULE_ALIAS's in '%s'\n",
- filename);
+ mod->name);
return 0;
}
return 1;
}
/* Looks like: mhi:S */
-static int do_mhi_entry(const char *filename, void *symval, char *alias)
+static int do_mhi_entry(struct module *mod, void *symval, char *alias)
{
DEF_FIELD_ADDR(symval, mhi_device_id, chan);
sprintf(alias, MHI_DEVICE_MODALIAS_FMT, *chan);
@@ -1420,7 +1420,7 @@ static int do_mhi_entry(const char *filename, void *symval, char *alias)
}
/* Looks like: mhi_ep:S */
-static int do_mhi_ep_entry(const char *filename, void *symval, char *alias)
+static int do_mhi_ep_entry(struct module *mod, void *symval, char *alias)
{
DEF_FIELD_ADDR(symval, mhi_device_id, chan);
sprintf(alias, MHI_EP_DEVICE_MODALIAS_FMT, *chan);
@@ -1429,7 +1429,7 @@ static int do_mhi_ep_entry(const char *filename, void *symval, char *alias)
}
/* Looks like: ishtp:{guid} */
-static int do_ishtp_entry(const char *filename, void *symval, char *alias)
+static int do_ishtp_entry(struct module *mod, void *symval, char *alias)
{
DEF_FIELD_ADDR(symval, ishtp_device_id, guid);
@@ -1440,7 +1440,7 @@ static int do_ishtp_entry(const char *filename, void *symval, char *alias)
return 1;
}
-static int do_auxiliary_entry(const char *filename, void *symval, char *alias)
+static int do_auxiliary_entry(struct module *mod, void *symval, char *alias)
{
DEF_FIELD_ADDR(symval, auxiliary_device_id, name);
sprintf(alias, AUXILIARY_MODULE_PREFIX "%s", *name);
@@ -1453,7 +1453,7 @@ static int do_auxiliary_entry(const char *filename, void *symval, char *alias)
*
* N is exactly 2 digits, where each is an upper-case hex digit.
*/
-static int do_ssam_entry(const char *filename, void *symval, char *alias)
+static int do_ssam_entry(struct module *mod, void *symval, char *alias)
{
DEF_FIELD(symval, ssam_device_id, match_flags);
DEF_FIELD(symval, ssam_device_id, domain);
@@ -1471,7 +1471,7 @@ static int do_ssam_entry(const char *filename, void *symval, char *alias)
}
/* Looks like: dfl:tNfN */
-static int do_dfl_entry(const char *filename, void *symval, char *alias)
+static int do_dfl_entry(struct module *mod, void *symval, char *alias)
{
DEF_FIELD(symval, dfl_device_id, type);
DEF_FIELD(symval, dfl_device_id, feature_id);
@@ -1483,7 +1483,7 @@ static int do_dfl_entry(const char *filename, void *symval, char *alias)
}
/* Looks like: cdx:vNdN */
-static int do_cdx_entry(const char *filename, void *symval,
+static int do_cdx_entry(struct module *mod, void *symval,
char *alias)
{
DEF_FIELD(symval, cdx_device_id, vendor);
@@ -1516,7 +1516,7 @@ static int do_cdx_entry(const char *filename, void *symval,
return 1;
}
-static int do_vchiq_entry(const char *filename, void *symval, char *alias)
+static int do_vchiq_entry(struct module *mod, void *symval, char *alias)
{
DEF_FIELD_ADDR(symval, vchiq_device_id, name);
sprintf(alias, "vchiq:%s", *name);
@@ -1525,7 +1525,7 @@ static int do_vchiq_entry(const char *filename, void *symval, char *alias)
}
/* Looks like: coreboot:tN */
-static int do_coreboot_entry(const char *filename, void *symval, char *alias)
+static int do_coreboot_entry(struct module *mod, void *symval, char *alias)
{
DEF_FIELD(symval, coreboot_device_id, tag);
sprintf(alias, "coreboot:t%08X", tag);
@@ -1545,7 +1545,7 @@ static bool sym_is(const char *name, unsigned namelen, const char *symbol)
static void do_table(void *symval, unsigned long size,
unsigned long id_size,
const char *device_id,
- int (*do_entry)(const char *filename, void *symval, char *alias),
+ int (*do_entry)(struct module *mod, void *symval, char *alias),
struct module *mod)
{
unsigned int i;
@@ -1556,7 +1556,7 @@ static void do_table(void *symval, unsigned long size,
size -= id_size;
for (i = 0; i < size; i += id_size) {
- if (do_entry(mod->name, symval+i, alias)) {
+ if (do_entry(mod, symval+i, alias)) {
module_alias_printf(mod, false, "%s", alias);
}
}
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 07/15] modpost: call module_alias_printf() from all do_*_entry() functions
2024-11-19 23:56 [PATCH 01/15] modpost: remove incorrect code in do_eisa_entry() Masahiro Yamada
` (4 preceding siblings ...)
2024-11-19 23:56 ` [PATCH 06/15] modpost: pass (struct module *) to do_*_entry() functions Masahiro Yamada
@ 2024-11-19 23:56 ` Masahiro Yamada
2024-11-19 23:56 ` [PATCH 08/15] modpost: convert do_pnp_card_entries() to a generic handler Masahiro Yamada
` (7 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2024-11-19 23:56 UTC (permalink / raw)
To: linux-kbuild
Cc: Masahiro Yamada, Nathan Chancellor, Nicolas Schier, linux-kernel
The do_*_entry() functions cannot check the length of the given buffer.
Use module_alias_printf() helper consistently for these functions.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
scripts/mod/file2alias.c | 438 ++++++++++++++++-----------------------
1 file changed, 181 insertions(+), 257 deletions(-)
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index 57385cdfd773..10da84599c1a 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -124,12 +124,9 @@ typedef struct {
struct devtable {
const char *device_id; /* name of table, __mod_<name>__*_device_table. */
unsigned long id_size;
- int (*do_entry)(struct module *mod, void *symval, char *alias);
+ void (*do_entry)(struct module *mod, void *symval);
};
-/* Size of alias provided to do_entry functions */
-#define ALIAS_SIZE 500
-
/* Define a variable f that holds the value of field f of struct devid
* based at address m.
*/
@@ -156,15 +153,6 @@ do { \
sprintf(str + strlen(str), "*"); \
} while(0)
-/* End in a wildcard, for future extension */
-static inline void add_wildcard(char *str)
-{
- int len = strlen(str);
-
- if (str[len - 1] != '*')
- strcat(str + len, "*");
-}
-
static inline void add_uuid(char *str, uuid_le uuid)
{
int len = strlen(str);
@@ -450,34 +438,34 @@ static void do_of_table(void *symval, unsigned long size,
}
/* Looks like: hid:bNvNpN */
-static int do_hid_entry(struct module *mod,
- void *symval, char *alias)
+static void do_hid_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, hid_device_id, bus);
DEF_FIELD(symval, hid_device_id, group);
DEF_FIELD(symval, hid_device_id, vendor);
DEF_FIELD(symval, hid_device_id, product);
- sprintf(alias, "hid:");
ADD(alias, "b", bus != HID_BUS_ANY, bus);
ADD(alias, "g", group != HID_GROUP_ANY, group);
ADD(alias, "v", vendor != HID_ANY_ID, vendor);
ADD(alias, "p", product != HID_ANY_ID, product);
- return 1;
+ module_alias_printf(mod, false, "hid:%s", alias);
}
/* Looks like: ieee1394:venNmoNspNverN */
-static int do_ieee1394_entry(struct module *mod,
- void *symval, char *alias)
+static void do_ieee1394_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, ieee1394_device_id, match_flags);
DEF_FIELD(symval, ieee1394_device_id, vendor_id);
DEF_FIELD(symval, ieee1394_device_id, model_id);
DEF_FIELD(symval, ieee1394_device_id, specifier_id);
DEF_FIELD(symval, ieee1394_device_id, version);
- strcpy(alias, "ieee1394:");
ADD(alias, "ven", match_flags & IEEE1394_MATCH_VENDOR_ID,
vendor_id);
ADD(alias, "mo", match_flags & IEEE1394_MATCH_MODEL_ID,
@@ -487,14 +475,13 @@ static int do_ieee1394_entry(struct module *mod,
ADD(alias, "ver", match_flags & IEEE1394_MATCH_VERSION,
version);
- add_wildcard(alias);
- return 1;
+ module_alias_printf(mod, true, "ieee1394:%s", alias);
}
/* Looks like: pci:vNdNsvNsdNbcNscNiN or <prefix>_pci:vNdNsvNsdNbcNscNiN. */
-static int do_pci_entry(struct module *mod,
- void *symval, char *alias)
+static void do_pci_entry(struct module *mod, void *symval)
{
+ char alias[256];
/* Class field can be divided into these three. */
unsigned char baseclass, subclass, interface,
baseclass_mask, subclass_mask, interface_mask;
@@ -517,7 +504,6 @@ static int do_pci_entry(struct module *mod,
default:
warn("Unknown PCI driver_override alias %08X\n",
override_only);
- return 0;
}
ADD(alias, "v", vendor != PCI_ANY_ID, vendor);
@@ -537,27 +523,27 @@ static int do_pci_entry(struct module *mod,
|| (interface_mask != 0 && interface_mask != 0xFF)) {
warn("Can't handle masks in %s:%04X\n",
mod->name, class_mask);
- return 0;
+ return;
}
ADD(alias, "bc", baseclass_mask == 0xFF, baseclass);
ADD(alias, "sc", subclass_mask == 0xFF, subclass);
ADD(alias, "i", interface_mask == 0xFF, interface);
- add_wildcard(alias);
- return 1;
+
+ module_alias_printf(mod, true, "%s", alias);
}
/* looks like: "ccw:tNmNdtNdmN" */
-static int do_ccw_entry(struct module *mod,
- void *symval, char *alias)
+static void do_ccw_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, ccw_device_id, match_flags);
DEF_FIELD(symval, ccw_device_id, cu_type);
DEF_FIELD(symval, ccw_device_id, cu_model);
DEF_FIELD(symval, ccw_device_id, dev_type);
DEF_FIELD(symval, ccw_device_id, dev_model);
- strcpy(alias, "ccw:");
ADD(alias, "t", match_flags&CCW_DEVICE_ID_MATCH_CU_TYPE,
cu_type);
ADD(alias, "m", match_flags&CCW_DEVICE_ID_MATCH_CU_MODEL,
@@ -566,47 +552,42 @@ static int do_ccw_entry(struct module *mod,
dev_type);
ADD(alias, "dm", match_flags&CCW_DEVICE_ID_MATCH_DEVICE_MODEL,
dev_model);
- add_wildcard(alias);
- return 1;
+
+ module_alias_printf(mod, true, "ccw:%s", alias);
}
/* looks like: "ap:tN" */
-static int do_ap_entry(struct module *mod,
- void *symval, char *alias)
+static void do_ap_entry(struct module *mod, void *symval)
{
DEF_FIELD(symval, ap_device_id, dev_type);
- sprintf(alias, "ap:t%02X*", dev_type);
- return 1;
+ module_alias_printf(mod, false, "ap:t%02X*", dev_type);
}
/* looks like: "css:tN" */
-static int do_css_entry(struct module *mod,
- void *symval, char *alias)
+static void do_css_entry(struct module *mod, void *symval)
{
DEF_FIELD(symval, css_device_id, type);
- sprintf(alias, "css:t%01X", type);
- return 1;
+ module_alias_printf(mod, false, "css:t%01X", type);
}
/* Looks like: "serio:tyNprNidNexN" */
-static int do_serio_entry(struct module *mod,
- void *symval, char *alias)
+static void do_serio_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, serio_device_id, type);
DEF_FIELD(symval, serio_device_id, proto);
DEF_FIELD(symval, serio_device_id, id);
DEF_FIELD(symval, serio_device_id, extra);
- strcpy(alias, "serio:");
ADD(alias, "ty", type != SERIO_ANY, type);
ADD(alias, "pr", proto != SERIO_ANY, proto);
ADD(alias, "id", id != SERIO_ANY, id);
ADD(alias, "ex", extra != SERIO_ANY, extra);
- add_wildcard(alias);
- return 1;
+ module_alias_printf(mod, true, "serio:%s", alias);
}
/* looks like: "acpi:ACPI0003" or "acpi:PNP0C0B" or "acpi:LNXVIDEO" or
@@ -616,21 +597,19 @@ static int do_serio_entry(struct module *mod,
* or _CLS. Also, bb, ss, and pp can be substituted with ??
* as don't care byte.
*/
-static int do_acpi_entry(struct module *mod,
- void *symval, char *alias)
+static void do_acpi_entry(struct module *mod, void *symval)
{
DEF_FIELD_ADDR(symval, acpi_device_id, id);
DEF_FIELD(symval, acpi_device_id, cls);
DEF_FIELD(symval, acpi_device_id, cls_msk);
if ((*id)[0])
- sprintf(alias, "acpi*:%s:*", *id);
+ module_alias_printf(mod, false, "acpi*:%s:*", *id);
else {
+ char alias[256];
int i, byte_shift, cnt = 0;
unsigned int msk;
- sprintf(&alias[cnt], "acpi*:");
- cnt = 6;
for (i = 1; i <= 3; i++) {
byte_shift = 8 * (3-i);
msk = (cls_msk >> byte_shift) & 0xFF;
@@ -641,9 +620,8 @@ static int do_acpi_entry(struct module *mod,
sprintf(&alias[cnt], "??");
cnt += 2;
}
- sprintf(&alias[cnt], ":*");
+ module_alias_printf(mod, false, "acpi*:%s:*", alias);
}
- return 1;
}
/* looks like: "pnp:dD" */
@@ -703,9 +681,9 @@ static void do_pnp_card_entries(void *symval, unsigned long size,
}
/* Looks like: pcmcia:mNcNfNfnNpfnNvaNvbNvcNvdN. */
-static int do_pcmcia_entry(struct module *mod,
- void *symval, char *alias)
+static void do_pcmcia_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
unsigned int i;
DEF_FIELD(symval, pcmcia_device_id, match_flags);
DEF_FIELD(symval, pcmcia_device_id, manf_id);
@@ -719,7 +697,6 @@ static int do_pcmcia_entry(struct module *mod,
(*prod_id_hash)[i] = TO_NATIVE((*prod_id_hash)[i]);
}
- strcpy(alias, "pcmcia:");
ADD(alias, "m", match_flags & PCMCIA_DEV_ID_MATCH_MANF_ID,
manf_id);
ADD(alias, "c", match_flags & PCMCIA_DEV_ID_MATCH_CARD_ID,
@@ -735,13 +712,12 @@ static int do_pcmcia_entry(struct module *mod,
ADD(alias, "pc", match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID3, (*prod_id_hash)[2]);
ADD(alias, "pd", match_flags & PCMCIA_DEV_ID_MATCH_PROD_ID4, (*prod_id_hash)[3]);
- add_wildcard(alias);
- return 1;
+ module_alias_printf(mod, true, "pcmcia:%s", alias);
}
-static int do_vio_entry(struct module *mod, void *symval,
- char *alias)
+static void do_vio_entry(struct module *mod, void *symval)
{
+ char alias[256];
char *tmp;
DEF_FIELD_ADDR(symval, vio_device_id, type);
DEF_FIELD_ADDR(symval, vio_device_id, compat);
@@ -754,8 +730,7 @@ static int do_vio_entry(struct module *mod, void *symval,
if (isspace (*tmp))
*tmp = '_';
- add_wildcard(alias);
- return 1;
+ module_alias_printf(mod, true, "%s", alias);
}
static void do_input(char *alias,
@@ -771,9 +746,10 @@ static void do_input(char *alias,
}
/* input:b0v0p0e0-eXkXrXaXmXlXsXfXwX where X is comma-separated %02X. */
-static int do_input_entry(struct module *mod, void *symval,
- char *alias)
+static void do_input_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, input_device_id, flags);
DEF_FIELD(symval, input_device_id, bustype);
DEF_FIELD(symval, input_device_id, vendor);
@@ -789,8 +765,6 @@ static int do_input_entry(struct module *mod, void *symval,
DEF_FIELD_ADDR(symval, input_device_id, ffbit);
DEF_FIELD_ADDR(symval, input_device_id, swbit);
- sprintf(alias, "input:");
-
ADD(alias, "b", flags & INPUT_DEVICE_ID_MATCH_BUS, bustype);
ADD(alias, "v", flags & INPUT_DEVICE_ID_MATCH_VENDOR, vendor);
ADD(alias, "p", flags & INPUT_DEVICE_ID_MATCH_PRODUCT, product);
@@ -825,99 +799,96 @@ static int do_input_entry(struct module *mod, void *symval,
sprintf(alias + strlen(alias), "w*");
if (flags & INPUT_DEVICE_ID_MATCH_SWBIT)
do_input(alias, *swbit, 0, INPUT_DEVICE_ID_SW_MAX);
- return 1;
+
+ module_alias_printf(mod, false, "input:%s", alias);
}
-static int do_eisa_entry(struct module *mod, void *symval,
- char *alias)
+static void do_eisa_entry(struct module *mod, void *symval)
{
DEF_FIELD_ADDR(symval, eisa_device_id, sig);
- sprintf(alias, EISA_DEVICE_MODALIAS_FMT "*", *sig);
- return 1;
+ module_alias_printf(mod, false, EISA_DEVICE_MODALIAS_FMT "*", *sig);
}
/* Looks like: parisc:tNhvNrevNsvN */
-static int do_parisc_entry(struct module *mod, void *symval,
- char *alias)
+static void do_parisc_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, parisc_device_id, hw_type);
DEF_FIELD(symval, parisc_device_id, hversion);
DEF_FIELD(symval, parisc_device_id, hversion_rev);
DEF_FIELD(symval, parisc_device_id, sversion);
- strcpy(alias, "parisc:");
ADD(alias, "t", hw_type != PA_HWTYPE_ANY_ID, hw_type);
ADD(alias, "hv", hversion != PA_HVERSION_ANY_ID, hversion);
ADD(alias, "rev", hversion_rev != PA_HVERSION_REV_ANY_ID, hversion_rev);
ADD(alias, "sv", sversion != PA_SVERSION_ANY_ID, sversion);
- add_wildcard(alias);
- return 1;
+ module_alias_printf(mod, true, "parisc:%s", alias);
}
/* Looks like: sdio:cNvNdN. */
-static int do_sdio_entry(struct module *mod,
- void *symval, char *alias)
+static void do_sdio_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, sdio_device_id, class);
DEF_FIELD(symval, sdio_device_id, vendor);
DEF_FIELD(symval, sdio_device_id, device);
- strcpy(alias, "sdio:");
ADD(alias, "c", class != (__u8)SDIO_ANY_ID, class);
ADD(alias, "v", vendor != (__u16)SDIO_ANY_ID, vendor);
ADD(alias, "d", device != (__u16)SDIO_ANY_ID, device);
- add_wildcard(alias);
- return 1;
+
+ module_alias_printf(mod, true, "sdio:%s", alias);
}
/* Looks like: ssb:vNidNrevN. */
-static int do_ssb_entry(struct module *mod,
- void *symval, char *alias)
+static void do_ssb_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, ssb_device_id, vendor);
DEF_FIELD(symval, ssb_device_id, coreid);
DEF_FIELD(symval, ssb_device_id, revision);
- strcpy(alias, "ssb:");
ADD(alias, "v", vendor != SSB_ANY_VENDOR, vendor);
ADD(alias, "id", coreid != SSB_ANY_ID, coreid);
ADD(alias, "rev", revision != SSB_ANY_REV, revision);
- add_wildcard(alias);
- return 1;
+
+ module_alias_printf(mod, true, "ssb:%s", alias);
}
/* Looks like: bcma:mNidNrevNclN. */
-static int do_bcma_entry(struct module *mod,
- void *symval, char *alias)
+static void do_bcma_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, bcma_device_id, manuf);
DEF_FIELD(symval, bcma_device_id, id);
DEF_FIELD(symval, bcma_device_id, rev);
DEF_FIELD(symval, bcma_device_id, class);
- strcpy(alias, "bcma:");
ADD(alias, "m", manuf != BCMA_ANY_MANUF, manuf);
ADD(alias, "id", id != BCMA_ANY_ID, id);
ADD(alias, "rev", rev != BCMA_ANY_REV, rev);
ADD(alias, "cl", class != BCMA_ANY_CLASS, class);
- add_wildcard(alias);
- return 1;
+
+ module_alias_printf(mod, true, "bcma:%s", alias);
}
/* Looks like: virtio:dNvN */
-static int do_virtio_entry(struct module *mod, void *symval,
- char *alias)
+static void do_virtio_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, virtio_device_id, device);
DEF_FIELD(symval, virtio_device_id, vendor);
- strcpy(alias, "virtio:");
ADD(alias, "d", device != VIRTIO_DEV_ANY_ID, device);
ADD(alias, "v", vendor != VIRTIO_DEV_ANY_ID, vendor);
- add_wildcard(alias);
- return 1;
+ module_alias_printf(mod, true, "virtio:%s", alias);
}
/*
@@ -926,8 +897,7 @@ static int do_virtio_entry(struct module *mod, void *symval,
* in the name.
*/
-static int do_vmbus_entry(struct module *mod, void *symval,
- char *alias)
+static void do_vmbus_entry(struct module *mod, void *symval)
{
int i;
DEF_FIELD_ADDR(symval, hv_vmbus_device_id, guid);
@@ -936,68 +906,57 @@ static int do_vmbus_entry(struct module *mod, void *symval,
for (i = 0; i < (sizeof(*guid) * 2); i += 2)
sprintf(&guid_name[i], "%02x", TO_NATIVE((guid->b)[i/2]));
- strcpy(alias, "vmbus:");
- strcat(alias, guid_name);
-
- return 1;
+ module_alias_printf(mod, false, "vmbus:%s", guid_name);
}
/* Looks like: rpmsg:S */
-static int do_rpmsg_entry(struct module *mod, void *symval,
- char *alias)
+static void do_rpmsg_entry(struct module *mod, void *symval)
{
DEF_FIELD_ADDR(symval, rpmsg_device_id, name);
- sprintf(alias, RPMSG_DEVICE_MODALIAS_FMT, *name);
- return 1;
+ module_alias_printf(mod, false, RPMSG_DEVICE_MODALIAS_FMT, *name);
}
/* Looks like: i2c:S */
-static int do_i2c_entry(struct module *mod, void *symval,
- char *alias)
+static void do_i2c_entry(struct module *mod, void *symval)
{
DEF_FIELD_ADDR(symval, i2c_device_id, name);
- sprintf(alias, I2C_MODULE_PREFIX "%s", *name);
- return 1;
+ module_alias_printf(mod, false, I2C_MODULE_PREFIX "%s", *name);
}
-static int do_i3c_entry(struct module *mod, void *symval,
- char *alias)
+static void do_i3c_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, i3c_device_id, match_flags);
DEF_FIELD(symval, i3c_device_id, dcr);
DEF_FIELD(symval, i3c_device_id, manuf_id);
DEF_FIELD(symval, i3c_device_id, part_id);
DEF_FIELD(symval, i3c_device_id, extra_info);
- strcpy(alias, "i3c:");
ADD(alias, "dcr", match_flags & I3C_MATCH_DCR, dcr);
ADD(alias, "manuf", match_flags & I3C_MATCH_MANUF, manuf_id);
ADD(alias, "part", match_flags & I3C_MATCH_PART, part_id);
ADD(alias, "ext", match_flags & I3C_MATCH_EXTRA_INFO, extra_info);
- return 1;
+ module_alias_printf(mod, false, "i3c:%s", alias);
}
-static int do_slim_entry(struct module *mod, void *symval, char *alias)
+static void do_slim_entry(struct module *mod, void *symval)
{
DEF_FIELD(symval, slim_device_id, manf_id);
DEF_FIELD(symval, slim_device_id, prod_code);
- sprintf(alias, "slim:%x:%x:*", manf_id, prod_code);
-
- return 1;
+ module_alias_printf(mod, false, "slim:%x:%x:*", manf_id, prod_code);
}
/* Looks like: spi:S */
-static int do_spi_entry(struct module *mod, void *symval,
- char *alias)
+static void do_spi_entry(struct module *mod, void *symval)
{
DEF_FIELD_ADDR(symval, spi_device_id, name);
- sprintf(alias, SPI_MODULE_PREFIX "%s", *name);
- return 1;
+ module_alias_printf(mod, false, SPI_MODULE_PREFIX "%s", *name);
}
static const struct dmifield {
@@ -1032,12 +991,11 @@ static void dmi_ascii_filter(char *d, const char *s)
}
-static int do_dmi_entry(struct module *mod, void *symval,
- char *alias)
+static void do_dmi_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
int i, j;
DEF_FIELD_ADDR(symval, dmi_system_id, matches);
- sprintf(alias, "dmi*");
for (i = 0; i < ARRAY_SIZE(dmi_fields); i++) {
for (j = 0; j < 4; j++) {
@@ -1052,80 +1010,75 @@ static int do_dmi_entry(struct module *mod, void *symval,
}
}
- strcat(alias, ":");
- return 1;
+ module_alias_printf(mod, false, "dmi*%s:", alias);
}
-static int do_platform_entry(struct module *mod,
- void *symval, char *alias)
+static void do_platform_entry(struct module *mod, void *symval)
{
DEF_FIELD_ADDR(symval, platform_device_id, name);
- sprintf(alias, PLATFORM_MODULE_PREFIX "%s", *name);
- return 1;
+
+ module_alias_printf(mod, false, PLATFORM_MODULE_PREFIX "%s", *name);
}
-static int do_mdio_entry(struct module *mod,
- void *symval, char *alias)
+static void do_mdio_entry(struct module *mod, void *symval)
{
+ char id[33];
int i;
DEF_FIELD(symval, mdio_device_id, phy_id);
DEF_FIELD(symval, mdio_device_id, phy_id_mask);
- alias += sprintf(alias, MDIO_MODULE_PREFIX);
-
for (i = 0; i < 32; i++) {
if (!((phy_id_mask >> (31-i)) & 1))
- *(alias++) = '?';
+ id[i] = '?';
else if ((phy_id >> (31-i)) & 1)
- *(alias++) = '1';
+ id[i] = '1';
else
- *(alias++) = '0';
+ id[i] = '0';
}
/* Terminate the string */
- *alias = 0;
+ id[32] = '\0';
- return 1;
+ module_alias_printf(mod, false, MDIO_MODULE_PREFIX "%s", id);
}
/* Looks like: zorro:iN. */
-static int do_zorro_entry(struct module *mod, void *symval,
- char *alias)
+static void do_zorro_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
DEF_FIELD(symval, zorro_device_id, id);
- strcpy(alias, "zorro:");
+
ADD(alias, "i", id != ZORRO_WILDCARD, id);
- return 1;
+
+ module_alias_printf(mod, false, "zorro:%s", alias);
}
/* looks like: "pnp:dD" */
-static int do_isapnp_entry(struct module *mod,
- void *symval, char *alias)
+static void do_isapnp_entry(struct module *mod, void *symval)
{
DEF_FIELD(symval, isapnp_device_id, vendor);
DEF_FIELD(symval, isapnp_device_id, function);
- sprintf(alias, "pnp:d%c%c%c%x%x%x%x*",
+ module_alias_printf(mod, false, "pnp:d%c%c%c%x%x%x%x*",
'A' + ((vendor >> 2) & 0x3f) - 1,
'A' + (((vendor & 3) << 3) | ((vendor >> 13) & 7)) - 1,
'A' + ((vendor >> 8) & 0x1f) - 1,
(function >> 4) & 0x0f, function & 0x0f,
(function >> 12) & 0x0f, (function >> 8) & 0x0f);
- return 1;
}
/* Looks like: "ipack:fNvNdN". */
-static int do_ipack_entry(struct module *mod,
- void *symval, char *alias)
+static void do_ipack_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
DEF_FIELD(symval, ipack_device_id, format);
DEF_FIELD(symval, ipack_device_id, vendor);
DEF_FIELD(symval, ipack_device_id, device);
- strcpy(alias, "ipack:");
+
ADD(alias, "f", format != IPACK_ANY_FORMAT, format);
ADD(alias, "v", vendor != IPACK_ANY_ID, vendor);
ADD(alias, "d", device != IPACK_ANY_ID, device);
- add_wildcard(alias);
- return 1;
+
+ module_alias_printf(mod, true, "ipack:%s", alias);
}
/*
@@ -1176,9 +1129,9 @@ static void append_nibble_mask(char **outp,
* N is exactly 8 digits, where each is an upper-case hex digit, or
* a ? or [] pattern matching exactly one digit.
*/
-static int do_amba_entry(struct module *mod,
- void *symval, char *alias)
+static void do_amba_entry(struct module *mod, void *symval)
{
+ char alias[256];
unsigned int digit;
char *p = alias;
DEF_FIELD(symval, amba_id, id);
@@ -1188,13 +1141,12 @@ static int do_amba_entry(struct module *mod,
fatal("%s: Masked-off bit(s) of AMBA device ID are non-zero: id=0x%08X, mask=0x%08X. Please fix this driver.\n",
mod->name, id, mask);
- p += sprintf(alias, "amba:d");
for (digit = 0; digit < 8; digit++)
append_nibble_mask(&p,
(id >> (4 * (7 - digit))) & 0xf,
(mask >> (4 * (7 - digit))) & 0xf);
- return 1;
+ module_alias_printf(mod, false, "amba:d%s", alias);
}
/*
@@ -1203,13 +1155,11 @@ static int do_amba_entry(struct module *mod,
* N is exactly 2 digits, where each is an upper-case hex digit, or
* a ? or [] pattern matching exactly one digit.
*/
-static int do_mips_cdmm_entry(struct module *mod,
- void *symval, char *alias)
+static void do_mips_cdmm_entry(struct module *mod, void *symval)
{
DEF_FIELD(symval, mips_cdmm_device_id, type);
- sprintf(alias, "mipscdmm:t%02X*", type);
- return 1;
+ module_alias_printf(mod, false, "mipscdmm:t%02X*", type);
}
/* LOOKS like cpu:type:x86,venVVVVfamFFFFmodMMMM:feature:*,FEAT,*
@@ -1218,137 +1168,130 @@ static int do_mips_cdmm_entry(struct module *mod,
* complicated.
*/
-static int do_x86cpu_entry(struct module *mod, void *symval,
- char *alias)
+static void do_x86cpu_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, x86_cpu_id, feature);
DEF_FIELD(symval, x86_cpu_id, family);
DEF_FIELD(symval, x86_cpu_id, model);
DEF_FIELD(symval, x86_cpu_id, vendor);
- strcpy(alias, "cpu:type:x86,");
ADD(alias, "ven", vendor != X86_VENDOR_ANY, vendor);
ADD(alias, "fam", family != X86_FAMILY_ANY, family);
ADD(alias, "mod", model != X86_MODEL_ANY, model);
strcat(alias, ":feature:*");
if (feature != X86_FEATURE_ANY)
sprintf(alias + strlen(alias), "%04X*", feature);
- return 1;
+
+ module_alias_printf(mod, false, "cpu:type:x86,%s", alias);
}
/* LOOKS like cpu:type:*:feature:*FEAT* */
-static int do_cpu_entry(struct module *mod, void *symval, char *alias)
+static void do_cpu_entry(struct module *mod, void *symval)
{
DEF_FIELD(symval, cpu_feature, feature);
- sprintf(alias, "cpu:type:*:feature:*%04X*", feature);
- return 1;
+ module_alias_printf(mod, false, "cpu:type:*:feature:*%04X*", feature);
}
/* Looks like: mei:S:uuid:N:* */
-static int do_mei_entry(struct module *mod, void *symval,
- char *alias)
+static void do_mei_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD_ADDR(symval, mei_cl_device_id, name);
DEF_FIELD_ADDR(symval, mei_cl_device_id, uuid);
DEF_FIELD(symval, mei_cl_device_id, version);
- sprintf(alias, MEI_CL_MODULE_PREFIX);
- sprintf(alias + strlen(alias), "%s:", (*name)[0] ? *name : "*");
add_uuid(alias, *uuid);
ADD(alias, ":", version != MEI_CL_VERSION_ANY, version);
- strcat(alias, ":*");
-
- return 1;
+ module_alias_printf(mod, false, MEI_CL_MODULE_PREFIX "%s:%s:*",
+ (*name)[0] ? *name : "*", alias);
}
/* Looks like: rapidio:vNdNavNadN */
-static int do_rio_entry(struct module *mod,
- void *symval, char *alias)
+static void do_rio_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, rio_device_id, did);
DEF_FIELD(symval, rio_device_id, vid);
DEF_FIELD(symval, rio_device_id, asm_did);
DEF_FIELD(symval, rio_device_id, asm_vid);
- strcpy(alias, "rapidio:");
ADD(alias, "v", vid != RIO_ANY_ID, vid);
ADD(alias, "d", did != RIO_ANY_ID, did);
ADD(alias, "av", asm_vid != RIO_ANY_ID, asm_vid);
ADD(alias, "ad", asm_did != RIO_ANY_ID, asm_did);
- add_wildcard(alias);
- return 1;
+ module_alias_printf(mod, true, "rapidio:%s", alias);
}
/* Looks like: ulpi:vNpN */
-static int do_ulpi_entry(struct module *mod, void *symval,
- char *alias)
+static void do_ulpi_entry(struct module *mod, void *symval)
{
DEF_FIELD(symval, ulpi_device_id, vendor);
DEF_FIELD(symval, ulpi_device_id, product);
- sprintf(alias, "ulpi:v%04xp%04x", vendor, product);
-
- return 1;
+ module_alias_printf(mod, false, "ulpi:v%04xp%04x", vendor, product);
}
/* Looks like: hdaudio:vNrNaN */
-static int do_hda_entry(struct module *mod, void *symval, char *alias)
+static void do_hda_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, hda_device_id, vendor_id);
DEF_FIELD(symval, hda_device_id, rev_id);
DEF_FIELD(symval, hda_device_id, api_version);
- strcpy(alias, "hdaudio:");
ADD(alias, "v", vendor_id != 0, vendor_id);
ADD(alias, "r", rev_id != 0, rev_id);
ADD(alias, "a", api_version != 0, api_version);
- add_wildcard(alias);
- return 1;
+ module_alias_printf(mod, true, "hdaudio:%s", alias);
}
/* Looks like: sdw:mNpNvNcN */
-static int do_sdw_entry(struct module *mod, void *symval, char *alias)
+static void do_sdw_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, sdw_device_id, mfg_id);
DEF_FIELD(symval, sdw_device_id, part_id);
DEF_FIELD(symval, sdw_device_id, sdw_version);
DEF_FIELD(symval, sdw_device_id, class_id);
- strcpy(alias, "sdw:");
ADD(alias, "m", mfg_id != 0, mfg_id);
ADD(alias, "p", part_id != 0, part_id);
ADD(alias, "v", sdw_version != 0, sdw_version);
ADD(alias, "c", class_id != 0, class_id);
- add_wildcard(alias);
- return 1;
+ module_alias_printf(mod, true, "sdw:%s", alias);
}
/* Looks like: fsl-mc:vNdN */
-static int do_fsl_mc_entry(struct module *mod, void *symval,
- char *alias)
+static void do_fsl_mc_entry(struct module *mod, void *symval)
{
DEF_FIELD(symval, fsl_mc_device_id, vendor);
DEF_FIELD_ADDR(symval, fsl_mc_device_id, obj_type);
- sprintf(alias, "fsl-mc:v%08Xd%s", vendor, *obj_type);
- return 1;
+ module_alias_printf(mod, false, "fsl-mc:v%08Xd%s", vendor, *obj_type);
}
/* Looks like: tbsvc:kSpNvNrN */
-static int do_tbsvc_entry(struct module *mod, void *symval, char *alias)
+static void do_tbsvc_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, tb_service_id, match_flags);
DEF_FIELD_ADDR(symval, tb_service_id, protocol_key);
DEF_FIELD(symval, tb_service_id, protocol_id);
DEF_FIELD(symval, tb_service_id, protocol_version);
DEF_FIELD(symval, tb_service_id, protocol_revision);
- strcpy(alias, "tbsvc:");
if (match_flags & TBSVC_MATCH_PROTOCOL_KEY)
sprintf(alias + strlen(alias), "k%s", *protocol_key);
else
@@ -1359,93 +1302,80 @@ static int do_tbsvc_entry(struct module *mod, void *symval, char *alias)
ADD(alias, "r", match_flags & TBSVC_MATCH_PROTOCOL_REVISION,
protocol_revision);
- add_wildcard(alias);
- return 1;
+ module_alias_printf(mod, true, "tbsvc:%s", alias);
}
/* Looks like: typec:idNmN */
-static int do_typec_entry(struct module *mod, void *symval, char *alias)
+static void do_typec_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, typec_device_id, svid);
DEF_FIELD(symval, typec_device_id, mode);
- sprintf(alias, "typec:id%04X", svid);
ADD(alias, "m", mode != TYPEC_ANY_MODE, mode);
- return 1;
+ module_alias_printf(mod, false, "typec:id%04X%s", svid, alias);
}
/* Looks like: tee:uuid */
-static int do_tee_entry(struct module *mod, void *symval, char *alias)
+static void do_tee_entry(struct module *mod, void *symval)
{
DEF_FIELD_ADDR(symval, tee_client_device_id, uuid);
- sprintf(alias, "tee:%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+ module_alias_printf(mod, true,
+ "tee:%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
uuid->b[0], uuid->b[1], uuid->b[2], uuid->b[3], uuid->b[4],
uuid->b[5], uuid->b[6], uuid->b[7], uuid->b[8], uuid->b[9],
uuid->b[10], uuid->b[11], uuid->b[12], uuid->b[13], uuid->b[14],
uuid->b[15]);
-
- add_wildcard(alias);
- return 1;
}
/* Looks like: wmi:guid */
-static int do_wmi_entry(struct module *mod, void *symval, char *alias)
+static void do_wmi_entry(struct module *mod, void *symval)
{
- int len;
DEF_FIELD_ADDR(symval, wmi_device_id, guid_string);
if (strlen(*guid_string) != UUID_STRING_LEN) {
warn("Invalid WMI device id 'wmi:%s' in '%s'\n",
*guid_string, mod->name);
- return 0;
+ return;
}
- len = snprintf(alias, ALIAS_SIZE, WMI_MODULE_PREFIX "%s", *guid_string);
- if (len < 0 || len >= ALIAS_SIZE) {
- warn("Could not generate all MODULE_ALIAS's in '%s'\n",
- mod->name);
- return 0;
- }
- return 1;
+ module_alias_printf(mod, false, WMI_MODULE_PREFIX "%s", *guid_string);
}
/* Looks like: mhi:S */
-static int do_mhi_entry(struct module *mod, void *symval, char *alias)
+static void do_mhi_entry(struct module *mod, void *symval)
{
DEF_FIELD_ADDR(symval, mhi_device_id, chan);
- sprintf(alias, MHI_DEVICE_MODALIAS_FMT, *chan);
- return 1;
+ module_alias_printf(mod, false, MHI_DEVICE_MODALIAS_FMT, *chan);
}
/* Looks like: mhi_ep:S */
-static int do_mhi_ep_entry(struct module *mod, void *symval, char *alias)
+static void do_mhi_ep_entry(struct module *mod, void *symval)
{
DEF_FIELD_ADDR(symval, mhi_device_id, chan);
- sprintf(alias, MHI_EP_DEVICE_MODALIAS_FMT, *chan);
- return 1;
+ module_alias_printf(mod, false, MHI_EP_DEVICE_MODALIAS_FMT, *chan);
}
/* Looks like: ishtp:{guid} */
-static int do_ishtp_entry(struct module *mod, void *symval, char *alias)
+static void do_ishtp_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
DEF_FIELD_ADDR(symval, ishtp_device_id, guid);
- strcpy(alias, ISHTP_MODULE_PREFIX "{");
add_guid(alias, *guid);
- strcat(alias, "}");
- return 1;
+ module_alias_printf(mod, false, ISHTP_MODULE_PREFIX "{%s}", alias);
}
-static int do_auxiliary_entry(struct module *mod, void *symval, char *alias)
+static void do_auxiliary_entry(struct module *mod, void *symval)
{
DEF_FIELD_ADDR(symval, auxiliary_device_id, name);
- sprintf(alias, AUXILIARY_MODULE_PREFIX "%s", *name);
- return 1;
+ module_alias_printf(mod, false, AUXILIARY_MODULE_PREFIX "%s", *name);
}
/*
@@ -1453,8 +1383,10 @@ static int do_auxiliary_entry(struct module *mod, void *symval, char *alias)
*
* N is exactly 2 digits, where each is an upper-case hex digit.
*/
-static int do_ssam_entry(struct module *mod, void *symval, char *alias)
+static void do_ssam_entry(struct module *mod, void *symval)
{
+ char alias[256] = {};
+
DEF_FIELD(symval, ssam_device_id, match_flags);
DEF_FIELD(symval, ssam_device_id, domain);
DEF_FIELD(symval, ssam_device_id, category);
@@ -1462,30 +1394,28 @@ static int do_ssam_entry(struct module *mod, void *symval, char *alias)
DEF_FIELD(symval, ssam_device_id, instance);
DEF_FIELD(symval, ssam_device_id, function);
- sprintf(alias, "ssam:d%02Xc%02X", domain, category);
ADD(alias, "t", match_flags & SSAM_MATCH_TARGET, target);
ADD(alias, "i", match_flags & SSAM_MATCH_INSTANCE, instance);
ADD(alias, "f", match_flags & SSAM_MATCH_FUNCTION, function);
- return 1;
+ module_alias_printf(mod, false, "ssam:d%02Xc%02X%s",
+ domain, category, alias);
}
/* Looks like: dfl:tNfN */
-static int do_dfl_entry(struct module *mod, void *symval, char *alias)
+static void do_dfl_entry(struct module *mod, void *symval)
{
DEF_FIELD(symval, dfl_device_id, type);
DEF_FIELD(symval, dfl_device_id, feature_id);
- sprintf(alias, "dfl:t%04Xf%04X", type, feature_id);
-
- add_wildcard(alias);
- return 1;
+ module_alias_printf(mod, true, "dfl:t%04Xf%04X", type, feature_id);
}
/* Looks like: cdx:vNdN */
-static int do_cdx_entry(struct module *mod, void *symval,
- char *alias)
+static void do_cdx_entry(struct module *mod, void *symval)
{
+ char alias[256];
+
DEF_FIELD(symval, cdx_device_id, vendor);
DEF_FIELD(symval, cdx_device_id, device);
DEF_FIELD(symval, cdx_device_id, subvendor);
@@ -1504,7 +1434,7 @@ static int do_cdx_entry(struct module *mod, void *symval,
default:
warn("Unknown CDX driver_override alias %08X\n",
override_only);
- return 0;
+ return;
}
ADD(alias, "v", vendor != CDX_ANY_ID, vendor);
@@ -1513,24 +1443,22 @@ static int do_cdx_entry(struct module *mod, void *symval,
ADD(alias, "sd", subdevice != CDX_ANY_ID, subdevice);
ADD(alias, "c", class_mask == 0xFFFFFF, class);
- return 1;
+ module_alias_printf(mod, false, "%s", alias);
}
-static int do_vchiq_entry(struct module *mod, void *symval, char *alias)
+static void do_vchiq_entry(struct module *mod, void *symval)
{
DEF_FIELD_ADDR(symval, vchiq_device_id, name);
- sprintf(alias, "vchiq:%s", *name);
- return 1;
+ module_alias_printf(mod, false, "vchiq:%s", *name);
}
/* Looks like: coreboot:tN */
-static int do_coreboot_entry(struct module *mod, void *symval, char *alias)
+static void do_coreboot_entry(struct module *mod, void *symval)
{
DEF_FIELD(symval, coreboot_device_id, tag);
- sprintf(alias, "coreboot:t%08X", tag);
- return 1;
+ module_alias_printf(mod, false, "coreboot:t%08X", tag);
}
/* Does namelen bytes of name exactly match the symbol? */
@@ -1545,21 +1473,17 @@ static bool sym_is(const char *name, unsigned namelen, const char *symbol)
static void do_table(void *symval, unsigned long size,
unsigned long id_size,
const char *device_id,
- int (*do_entry)(struct module *mod, void *symval, char *alias),
+ void (*do_entry)(struct module *mod, void *symval),
struct module *mod)
{
unsigned int i;
- char alias[ALIAS_SIZE];
device_id_check(mod->name, device_id, size, id_size, symval);
/* Leave last one: it's the terminator. */
size -= id_size;
- for (i = 0; i < size; i += id_size) {
- if (do_entry(mod, symval+i, alias)) {
- module_alias_printf(mod, false, "%s", alias);
- }
- }
+ for (i = 0; i < size; i += id_size)
+ do_entry(mod, symval + i);
}
static const struct devtable devtable[] = {
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 08/15] modpost: convert do_pnp_card_entries() to a generic handler
2024-11-19 23:56 [PATCH 01/15] modpost: remove incorrect code in do_eisa_entry() Masahiro Yamada
` (5 preceding siblings ...)
2024-11-19 23:56 ` [PATCH 07/15] modpost: call module_alias_printf() from all " Masahiro Yamada
@ 2024-11-19 23:56 ` Masahiro Yamada
2024-11-19 23:56 ` [PATCH 09/15] modpost: convert do_pnp_device_entry() " Masahiro Yamada
` (6 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2024-11-19 23:56 UTC (permalink / raw)
To: linux-kbuild
Cc: Masahiro Yamada, Nathan Chancellor, Nicolas Schier, linux-kernel
do_pnp_card_entries() no longer needs to iterate over the
pnp_card_device_id array.
Convert it to a generic ->do_entry() handler.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
scripts/mod/file2alias.c | 39 ++++++++++++++-------------------------
1 file changed, 14 insertions(+), 25 deletions(-)
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index 10da84599c1a..eabf702ef1a2 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -649,34 +649,24 @@ static void do_pnp_device_entry(void *symval, unsigned long size,
}
/* looks like: "pnp:dD" for every device of the card */
-static void do_pnp_card_entries(void *symval, unsigned long size,
- struct module *mod)
+static void do_pnp_card_entry(struct module *mod, void *symval)
{
- const unsigned long id_size = SIZE_pnp_card_device_id;
- const unsigned int count = (size / id_size)-1;
- unsigned int i;
+ DEF_FIELD_ADDR(symval, pnp_card_device_id, devs);
- device_id_check(mod->name, "pnp", size, id_size, symval);
+ for (unsigned int i = 0; i < PNP_MAX_DEVICES; i++) {
+ const char *id = (char *)(*devs)[i].id;
+ char acpi_id[PNP_ID_LEN];
- for (i = 0; i < count; i++) {
- unsigned int j;
- DEF_FIELD_ADDR(symval + i * id_size, pnp_card_device_id, devs);
+ if (!id[0])
+ break;
- for (j = 0; j < PNP_MAX_DEVICES; j++) {
- const char *id = (char *)(*devs)[j].id;
- char acpi_id[PNP_ID_LEN];
+ /* fix broken pnp bus lowercasing */
+ for (unsigned int j = 0; j < sizeof(acpi_id); j++)
+ acpi_id[j] = toupper(id[j]);
- if (!id[0])
- break;
-
- /* add an individual alias for every device entry */
- module_alias_printf(mod, false, "pnp:d%s*", id);
-
- /* fix broken pnp bus lowercasing */
- for (int k = 0; k < sizeof(acpi_id); k++)
- acpi_id[k] = toupper(id[k]);
- module_alias_printf(mod, false, "acpi*:%s:*", acpi_id);
- }
+ /* add an individual alias for every device entry */
+ module_alias_printf(mod, false, "pnp:d%s*", id);
+ module_alias_printf(mod, false, "acpi*:%s:*", acpi_id);
}
}
@@ -1539,6 +1529,7 @@ static const struct devtable devtable[] = {
{"cdx", SIZE_cdx_device_id, do_cdx_entry},
{"vchiq", SIZE_vchiq_device_id, do_vchiq_entry},
{"coreboot", SIZE_coreboot_device_id, do_coreboot_entry},
+ {"pnp_card", SIZE_pnp_card_device_id, do_pnp_card_entry},
};
/* Create MODULE_ALIAS() statements.
@@ -1589,8 +1580,6 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
do_of_table(symval, sym->st_size, mod);
else if (sym_is(name, namelen, "pnp"))
do_pnp_device_entry(symval, sym->st_size, mod);
- else if (sym_is(name, namelen, "pnp_card"))
- do_pnp_card_entries(symval, sym->st_size, mod);
else {
int i;
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 09/15] modpost: convert do_pnp_device_entry() to a generic handler
2024-11-19 23:56 [PATCH 01/15] modpost: remove incorrect code in do_eisa_entry() Masahiro Yamada
` (6 preceding siblings ...)
2024-11-19 23:56 ` [PATCH 08/15] modpost: convert do_pnp_card_entries() to a generic handler Masahiro Yamada
@ 2024-11-19 23:56 ` Masahiro Yamada
2024-11-19 23:56 ` [PATCH 10/15] modpost: convert do_of_table() " Masahiro Yamada
` (5 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2024-11-19 23:56 UTC (permalink / raw)
To: linux-kbuild
Cc: Masahiro Yamada, Nathan Chancellor, Nicolas Schier, linux-kernel
do_pnp_device_entry() no longer needs to iterate over the
pnp_device_id array.
Convert it to a generic ->do_entry() handler.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
scripts/mod/file2alias.c | 30 +++++++++---------------------
1 file changed, 9 insertions(+), 21 deletions(-)
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index eabf702ef1a2..2bb9796a30be 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -625,27 +625,16 @@ static void do_acpi_entry(struct module *mod, void *symval)
}
/* looks like: "pnp:dD" */
-static void do_pnp_device_entry(void *symval, unsigned long size,
- struct module *mod)
+static void do_pnp_device_entry(struct module *mod, void *symval)
{
- const unsigned long id_size = SIZE_pnp_device_id;
- const unsigned int count = (size / id_size)-1;
- unsigned int i;
+ DEF_FIELD_ADDR(symval, pnp_device_id, id);
+ char acpi_id[sizeof(*id)];
- device_id_check(mod->name, "pnp", size, id_size, symval);
-
- for (i = 0; i < count; i++) {
- DEF_FIELD_ADDR(symval + i*id_size, pnp_device_id, id);
- char acpi_id[sizeof(*id)];
- int j;
-
- module_alias_printf(mod, false, "pnp:d%s*", *id);
-
- /* fix broken pnp bus lowercasing */
- for (j = 0; j < sizeof(acpi_id); j++)
- acpi_id[j] = toupper((*id)[j]);
- module_alias_printf(mod, false, "acpi*:%s:*", acpi_id);
- }
+ /* fix broken pnp bus lowercasing */
+ for (unsigned int i = 0; i < sizeof(acpi_id); i++)
+ acpi_id[i] = toupper((*id)[i]);
+ module_alias_printf(mod, false, "pnp:d%s*", *id);
+ module_alias_printf(mod, false, "acpi*:%s:*", acpi_id);
}
/* looks like: "pnp:dD" for every device of the card */
@@ -1529,6 +1518,7 @@ static const struct devtable devtable[] = {
{"cdx", SIZE_cdx_device_id, do_cdx_entry},
{"vchiq", SIZE_vchiq_device_id, do_vchiq_entry},
{"coreboot", SIZE_coreboot_device_id, do_coreboot_entry},
+ {"pnp", SIZE_pnp_device_id, do_pnp_device_entry},
{"pnp_card", SIZE_pnp_card_device_id, do_pnp_card_entry},
};
@@ -1578,8 +1568,6 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
do_usb_table(symval, sym->st_size, mod);
else if (sym_is(name, namelen, "of"))
do_of_table(symval, sym->st_size, mod);
- else if (sym_is(name, namelen, "pnp"))
- do_pnp_device_entry(symval, sym->st_size, mod);
else {
int i;
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 10/15] modpost: convert do_of_table() to a generic handler
2024-11-19 23:56 [PATCH 01/15] modpost: remove incorrect code in do_eisa_entry() Masahiro Yamada
` (7 preceding siblings ...)
2024-11-19 23:56 ` [PATCH 09/15] modpost: convert do_pnp_device_entry() " Masahiro Yamada
@ 2024-11-19 23:56 ` Masahiro Yamada
2024-11-19 23:56 ` [PATCH 11/15] modpost: convert do_usb_table() " Masahiro Yamada
` (4 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2024-11-19 23:56 UTC (permalink / raw)
To: linux-kbuild
Cc: Masahiro Yamada, Nathan Chancellor, Nicolas Schier, linux-kernel
do_of_table() no longer needs to iterate over the of_device_id array.
Convert it to a generic ->do_entry() handler.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
scripts/mod/file2alias.c | 20 ++------------------
1 file changed, 2 insertions(+), 18 deletions(-)
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index 2bb9796a30be..42a76ad25d40 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -396,7 +396,7 @@ static void do_usb_table(void *symval, unsigned long size,
do_usb_entry_multi(symval + i, mod);
}
-static void do_of_entry_multi(void *symval, struct module *mod)
+static void do_of_entry(struct module *mod, void *symval)
{
char alias[500];
int len;
@@ -422,21 +422,6 @@ static void do_of_entry_multi(void *symval, struct module *mod)
module_alias_printf(mod, false, "%sC*", alias);
}
-static void do_of_table(void *symval, unsigned long size,
- struct module *mod)
-{
- unsigned int i;
- const unsigned long id_size = SIZE_of_device_id;
-
- device_id_check(mod->name, "of", size, id_size, symval);
-
- /* Leave last one: it's the terminator. */
- size -= id_size;
-
- for (i = 0; i < size; i += id_size)
- do_of_entry_multi(symval + i, mod);
-}
-
/* Looks like: hid:bNvNpN */
static void do_hid_entry(struct module *mod, void *symval)
{
@@ -1518,6 +1503,7 @@ static const struct devtable devtable[] = {
{"cdx", SIZE_cdx_device_id, do_cdx_entry},
{"vchiq", SIZE_vchiq_device_id, do_vchiq_entry},
{"coreboot", SIZE_coreboot_device_id, do_coreboot_entry},
+ {"of", SIZE_of_device_id, do_of_entry},
{"pnp", SIZE_pnp_device_id, do_pnp_device_entry},
{"pnp_card", SIZE_pnp_card_device_id, do_pnp_card_entry},
};
@@ -1566,8 +1552,6 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
/* First handle the "special" cases */
if (sym_is(name, namelen, "usb"))
do_usb_table(symval, sym->st_size, mod);
- else if (sym_is(name, namelen, "of"))
- do_of_table(symval, sym->st_size, mod);
else {
int i;
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 11/15] modpost: convert do_usb_table() to a generic handler
2024-11-19 23:56 [PATCH 01/15] modpost: remove incorrect code in do_eisa_entry() Masahiro Yamada
` (8 preceding siblings ...)
2024-11-19 23:56 ` [PATCH 10/15] modpost: convert do_of_table() " Masahiro Yamada
@ 2024-11-19 23:56 ` Masahiro Yamada
2024-11-19 23:56 ` [PATCH 12/15] modpost: move strstarts() to modpost.h Masahiro Yamada
` (3 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2024-11-19 23:56 UTC (permalink / raw)
To: linux-kbuild
Cc: Masahiro Yamada, Nathan Chancellor, Nicolas Schier, linux-kernel
do_usb_table() no longer needs to iterate over the usb_device_id array.
Convert it to a generic ->do_entry() handler.
This is the last special case. Clean up handle_moddevtable().
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
scripts/mod/file2alias.c | 39 +++++++++------------------------------
1 file changed, 9 insertions(+), 30 deletions(-)
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index 42a76ad25d40..b2d5e6451959 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -120,7 +120,6 @@ typedef struct {
* we handle those differences explicitly below */
#include "../../include/linux/mod_devicetable.h"
-/* This array collects all instances that use the generic do_table */
struct devtable {
const char *device_id; /* name of table, __mod_<name>__*_device_table. */
unsigned long id_size;
@@ -316,7 +315,7 @@ static unsigned int incbcd(unsigned int *bcd,
return init;
}
-static void do_usb_entry_multi(void *symval, struct module *mod)
+static void do_usb_entry_multi(struct module *mod, void *symval)
{
unsigned int devlo, devhi;
unsigned char chi, clo, max;
@@ -381,21 +380,6 @@ static void do_usb_entry_multi(void *symval, struct module *mod)
}
}
-static void do_usb_table(void *symval, unsigned long size,
- struct module *mod)
-{
- unsigned int i;
- const unsigned long id_size = SIZE_usb_device_id;
-
- device_id_check(mod->name, "usb", size, id_size, symval);
-
- /* Leave last one: it's the terminator. */
- size -= id_size;
-
- for (i = 0; i < size; i += id_size)
- do_usb_entry_multi(symval + i, mod);
-}
-
static void do_of_entry(struct module *mod, void *symval)
{
char alias[500];
@@ -1504,6 +1488,7 @@ static const struct devtable devtable[] = {
{"vchiq", SIZE_vchiq_device_id, do_vchiq_entry},
{"coreboot", SIZE_coreboot_device_id, do_coreboot_entry},
{"of", SIZE_of_device_id, do_of_entry},
+ {"usb", SIZE_usb_device_id, do_usb_entry_multi},
{"pnp", SIZE_pnp_device_id, do_pnp_device_entry},
{"pnp_card", SIZE_pnp_card_device_id, do_pnp_card_entry},
};
@@ -1549,21 +1534,15 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
symval = sym_get_data(info, sym);
}
- /* First handle the "special" cases */
- if (sym_is(name, namelen, "usb"))
- do_usb_table(symval, sym->st_size, mod);
- else {
- int i;
+ for (int i = 0; i < ARRAY_SIZE(devtable); i++) {
+ const struct devtable *p = &devtable[i];
- for (i = 0; i < ARRAY_SIZE(devtable); i++) {
- const struct devtable *p = &devtable[i];
-
- if (sym_is(name, namelen, p->device_id)) {
- do_table(symval, sym->st_size, p->id_size,
- p->device_id, p->do_entry, mod);
- break;
- }
+ if (sym_is(name, namelen, p->device_id)) {
+ do_table(symval, sym->st_size, p->id_size,
+ p->device_id, p->do_entry, mod);
+ break;
}
}
+
free(zeros);
}
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 12/15] modpost: move strstarts() to modpost.h
2024-11-19 23:56 [PATCH 01/15] modpost: remove incorrect code in do_eisa_entry() Masahiro Yamada
` (9 preceding siblings ...)
2024-11-19 23:56 ` [PATCH 11/15] modpost: convert do_usb_table() " Masahiro Yamada
@ 2024-11-19 23:56 ` Masahiro Yamada
2024-11-19 23:56 ` [PATCH 13/15] modpost: rename variables in handle_moddevtable() Masahiro Yamada
` (2 subsequent siblings)
13 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2024-11-19 23:56 UTC (permalink / raw)
To: linux-kbuild
Cc: Masahiro Yamada, Nathan Chancellor, Nicolas Schier, linux-kernel
This macro is useful in file2alias.c as well.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
scripts/mod/file2alias.c | 2 +-
scripts/mod/modpost.c | 2 --
scripts/mod/modpost.h | 2 ++
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index b2d5e6451959..01a4b0eaca6d 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -1513,7 +1513,7 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
return;
/* All our symbols are of form __mod_<name>__<identifier>_device_table. */
- if (strncmp(symname, "__mod_", strlen("__mod_")))
+ if (!strstarts(symname, "__mod_"))
return;
name = symname + strlen("__mod_");
namelen = strlen(name);
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 1948d69ce2b9..3bbd5efcf3f3 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -341,8 +341,6 @@ static const char *sec_name(const struct elf_info *info, unsigned int secindex)
return sech_name(info, &info->sechdrs[secindex]);
}
-#define strstarts(str, prefix) (strncmp(str, prefix, strlen(prefix)) == 0)
-
static struct symbol *sym_add_exported(const char *name, struct module *mod,
bool gpl_only, const char *namespace)
{
diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h
index 52efe0026b34..49848fcbe2a1 100644
--- a/scripts/mod/modpost.h
+++ b/scripts/mod/modpost.h
@@ -67,6 +67,8 @@
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+#define strstarts(str, prefix) (strncmp(str, prefix, strlen(prefix)) == 0)
+
struct buffer {
char *p;
int pos;
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 13/15] modpost: rename variables in handle_moddevtable()
2024-11-19 23:56 [PATCH 01/15] modpost: remove incorrect code in do_eisa_entry() Masahiro Yamada
` (10 preceding siblings ...)
2024-11-19 23:56 ` [PATCH 12/15] modpost: move strstarts() to modpost.h Masahiro Yamada
@ 2024-11-19 23:56 ` Masahiro Yamada
2024-11-19 23:56 ` [PATCH 14/15] modpost: rename alias symbol for MODULE_DEVICE_TABLE() Masahiro Yamada
2024-11-19 23:56 ` [PATCH 15/15] modpost: improve error messages in device_id_check() Masahiro Yamada
13 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2024-11-19 23:56 UTC (permalink / raw)
To: linux-kbuild
Cc: Masahiro Yamada, Nathan Chancellor, Nicolas Schier, linux-kernel
This commit renames the variables in handle_moddevtable() as follows:
name -> type
namelen -> typelen
identifier -> name
These changes align with the names in include/linux/module.h:
extern typeof(name) __mod_##type##__##name##_device_table
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
scripts/mod/file2alias.c | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index 01a4b0eaca6d..2374737b9d22 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -1501,8 +1501,8 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
{
void *symval;
char *zeros = NULL;
- const char *name, *identifier;
- unsigned int namelen;
+ const char *type, *name;
+ size_t typelen;
/* We're looking for a section relative symbol */
if (!sym->st_shndx || get_secindex(info, sym) >= info->num_sections)
@@ -1512,19 +1512,19 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT)
return;
- /* All our symbols are of form __mod_<name>__<identifier>_device_table. */
+ /* All our symbols are of form __mod_<type>__<name>_device_table. */
if (!strstarts(symname, "__mod_"))
return;
- name = symname + strlen("__mod_");
- namelen = strlen(name);
- if (namelen < strlen("_device_table"))
+ type = symname + strlen("__mod_");
+ typelen = strlen(type);
+ if (typelen < strlen("_device_table"))
return;
- if (strcmp(name + namelen - strlen("_device_table"), "_device_table"))
+ if (strcmp(type + typelen - strlen("_device_table"), "_device_table"))
return;
- identifier = strstr(name, "__");
- if (!identifier)
+ name = strstr(type, "__");
+ if (!name)
return;
- namelen = identifier - name;
+ typelen = name - type;
/* Handle all-NULL symbols allocated into .bss */
if (info->sechdrs[get_secindex(info, sym)].sh_type & SHT_NOBITS) {
@@ -1537,7 +1537,7 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
for (int i = 0; i < ARRAY_SIZE(devtable); i++) {
const struct devtable *p = &devtable[i];
- if (sym_is(name, namelen, p->device_id)) {
+ if (sym_is(type, typelen, p->device_id)) {
do_table(symval, sym->st_size, p->id_size,
p->device_id, p->do_entry, mod);
break;
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 14/15] modpost: rename alias symbol for MODULE_DEVICE_TABLE()
2024-11-19 23:56 [PATCH 01/15] modpost: remove incorrect code in do_eisa_entry() Masahiro Yamada
` (11 preceding siblings ...)
2024-11-19 23:56 ` [PATCH 13/15] modpost: rename variables in handle_moddevtable() Masahiro Yamada
@ 2024-11-19 23:56 ` Masahiro Yamada
2024-11-19 23:56 ` [PATCH 15/15] modpost: improve error messages in device_id_check() Masahiro Yamada
13 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2024-11-19 23:56 UTC (permalink / raw)
To: linux-kbuild
Cc: Masahiro Yamada, Daniel Gomez, Luis Chamberlain,
Nathan Chancellor, Nicolas Schier, Petr Pavlu, Sami Tolvanen,
linux-kernel, linux-modules
This commit renames the alias symbol, __mod_<type>__<name>_device_table
to __mod_device_table__<type>__<name>.
This change simplifies the code slightly, as there is no longer a need
to check both the prefix and suffix.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
include/linux/module.h | 2 +-
scripts/mod/file2alias.c | 17 +++++++----------
2 files changed, 8 insertions(+), 11 deletions(-)
diff --git a/include/linux/module.h b/include/linux/module.h
index 88ecc5e9f523..3dd79a3d0cbf 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -247,7 +247,7 @@ extern void cleanup_module(void);
#ifdef MODULE
/* Creates an alias so file2alias.c can find device table. */
#define MODULE_DEVICE_TABLE(type, name) \
-extern typeof(name) __mod_##type##__##name##_device_table \
+extern typeof(name) __mod_device_table__##type##__##name \
__attribute__ ((unused, alias(__stringify(name))))
#else /* !MODULE */
#define MODULE_DEVICE_TABLE(type, name)
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index 2374737b9d22..b1291cc7bd80 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -121,7 +121,7 @@ typedef struct {
#include "../../include/linux/mod_devicetable.h"
struct devtable {
- const char *device_id; /* name of table, __mod_<name>__*_device_table. */
+ const char *device_id;
unsigned long id_size;
void (*do_entry)(struct module *mod, void *symval);
};
@@ -188,7 +188,7 @@ static void device_id_check(const char *modname, const char *device_id,
int i;
if (size % id_size || size < id_size) {
- fatal("%s: sizeof(struct %s_device_id)=%lu is not a modulo of the size of section __mod_%s__<identifier>_device_table=%lu.\n"
+ fatal("%s: sizeof(struct %s_device_id)=%lu is not a modulo of the size of section __mod_device_table__%s__<identifier>=%lu.\n"
"Fix definition of struct %s_device_id in mod_devicetable.h\n",
modname, device_id, id_size, device_id, size, device_id);
}
@@ -1503,6 +1503,7 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
char *zeros = NULL;
const char *type, *name;
size_t typelen;
+ static const char *prefix = "__mod_device_table__";
/* We're looking for a section relative symbol */
if (!sym->st_shndx || get_secindex(info, sym) >= info->num_sections)
@@ -1512,15 +1513,11 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT)
return;
- /* All our symbols are of form __mod_<type>__<name>_device_table. */
- if (!strstarts(symname, "__mod_"))
- return;
- type = symname + strlen("__mod_");
- typelen = strlen(type);
- if (typelen < strlen("_device_table"))
- return;
- if (strcmp(type + typelen - strlen("_device_table"), "_device_table"))
+ /* All our symbols are of form __mod_device_table__<type>__<name>. */
+ if (!strstarts(symname, prefix))
return;
+ type = symname + strlen(prefix);
+
name = strstr(type, "__");
if (!name)
return;
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 15/15] modpost: improve error messages in device_id_check()
2024-11-19 23:56 [PATCH 01/15] modpost: remove incorrect code in do_eisa_entry() Masahiro Yamada
` (12 preceding siblings ...)
2024-11-19 23:56 ` [PATCH 14/15] modpost: rename alias symbol for MODULE_DEVICE_TABLE() Masahiro Yamada
@ 2024-11-19 23:56 ` Masahiro Yamada
13 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2024-11-19 23:56 UTC (permalink / raw)
To: linux-kbuild
Cc: Masahiro Yamada, Nathan Chancellor, Nicolas Schier, linux-kernel
The first error message in device_id_check() is obscure and can be
misleading because the cause of the error is unlikely to be found in
the struct definition in mod_devicetable.h.
This type of error occurs when an array is passed to an incorrect type
of MODULE_DEVICE_TABLE().
[Example 1]
static const struct acpi_device_id foo_ids[] = {
{ "FOO" },
{ /* sentinel */ },
};
MODULE_DEVICE_TABLE(of, foo_ids);
Currently, modpost outputs a meaningless suggestion:
ERROR: modpost: ...: sizeof(struct of_device_id)=200 is not a modulo of the size of section __mod_device_table__of__<identifier>=64.
Fix definition of struct of_device_id in mod_devicetable.h
The root cause here is that MODULE_DEVICE_TABLE(of, ...) is used instead
of the correct MODULE_DEVICE_TABLE(acpi, ...).
This commit provides a more intuitive error message:
ERROR: modpost: ...: type mismatch between foo_ids[] and MODULE_DEVICE_TABLE(of, ...)
The second error message, related to a missing terminator, is too
verbose.
[Example 2]
static const struct acpi_device_id foo_ids[] = {
{ "FOO" },
};
MODULE_DEVICE_TABLE(acpi, foo_ids);
The current error message is overly long, and does not pinpoint the
incorrect array:
...: struct acpi_device_id is 32 bytes. The last of 1 is:
0x46 0x4f 0x4f 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
ERROR: modpost: ...: struct acpi_device_id is not terminated with a NULL entry!
This commit changes it to a more concise error message, sufficient to
identify the incorrect array:
ERROR: modpost: ...: foo_ids[] is not terminated with a NULL entry
Lastly, this commit squashes device_id_check() into do_table() and
changes fatal() into error(), allowing modpost to continue processing
other modules.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
scripts/mod/file2alias.c | 55 +++++++++++++---------------------------
1 file changed, 18 insertions(+), 37 deletions(-)
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index b1291cc7bd80..3b46c2fdec50 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -174,40 +174,6 @@ static inline void add_guid(char *str, guid_t guid)
guid.b[12], guid.b[13], guid.b[14], guid.b[15]);
}
-/**
- * Check that sizeof(device_id type) are consistent with size of section
- * in .o file. If in-consistent then userspace and kernel does not agree
- * on actual size which is a bug.
- * Also verify that the final entry in the table is all zeros.
- * Ignore both checks if build host differ from target host and size differs.
- **/
-static void device_id_check(const char *modname, const char *device_id,
- unsigned long size, unsigned long id_size,
- void *symval)
-{
- int i;
-
- if (size % id_size || size < id_size) {
- fatal("%s: sizeof(struct %s_device_id)=%lu is not a modulo of the size of section __mod_device_table__%s__<identifier>=%lu.\n"
- "Fix definition of struct %s_device_id in mod_devicetable.h\n",
- modname, device_id, id_size, device_id, size, device_id);
- }
- /* Verify last one is a terminator */
- for (i = 0; i < id_size; i++ ) {
- if (*(uint8_t*)(symval+size-id_size+i)) {
- fprintf(stderr,
- "%s: struct %s_device_id is %lu bytes. The last of %lu is:\n",
- modname, device_id, id_size, size / id_size);
- for (i = 0; i < id_size; i++ )
- fprintf(stderr,"0x%02x ",
- *(uint8_t*)(symval+size-id_size+i) );
- fprintf(stderr,"\n");
- fatal("%s: struct %s_device_id is not terminated with a NULL entry!\n",
- modname, device_id);
- }
- }
-}
-
/* USB is special because the bcdDevice can be matched against a numeric range */
/* Looks like "usb:vNpNdNdcNdscNdpNicNiscNipNinN" */
static void do_usb_entry(void *symval,
@@ -1418,7 +1384,7 @@ static bool sym_is(const char *name, unsigned namelen, const char *symbol)
return memcmp(name, symbol, namelen) == 0;
}
-static void do_table(void *symval, unsigned long size,
+static void do_table(const char *name, void *symval, unsigned long size,
unsigned long id_size,
const char *device_id,
void (*do_entry)(struct module *mod, void *symval),
@@ -1426,7 +1392,21 @@ static void do_table(void *symval, unsigned long size,
{
unsigned int i;
- device_id_check(mod->name, device_id, size, id_size, symval);
+ if (size % id_size || size < id_size) {
+ error("%s: type mismatch between %s[] and MODULE_DEVICE_TABLE(%s, ...)\n",
+ mod->name, name, device_id);
+ return;
+ }
+
+ /* Verify the last entry is a terminator */
+ for (i = size - id_size; i < size; i++) {
+ if (*(uint8_t *)(symval + i)) {
+ error("%s: %s[] is not terminated with a NULL entry\n",
+ mod->name, name);
+ return;
+ }
+ }
+
/* Leave last one: it's the terminator. */
size -= id_size;
@@ -1522,6 +1502,7 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
if (!name)
return;
typelen = name - type;
+ name += strlen("__");
/* Handle all-NULL symbols allocated into .bss */
if (info->sechdrs[get_secindex(info, sym)].sh_type & SHT_NOBITS) {
@@ -1535,7 +1516,7 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
const struct devtable *p = &devtable[i];
if (sym_is(type, typelen, p->device_id)) {
- do_table(symval, sym->st_size, p->id_size,
+ do_table(name, symval, sym->st_size, p->id_size,
p->device_id, p->do_entry, mod);
break;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 03/15] modpost: introduce module_alias_printf() helper
2024-11-19 23:56 ` [PATCH 03/15] modpost: introduce module_alias_printf() helper Masahiro Yamada
@ 2024-11-20 2:37 ` Masahiro Yamada
0 siblings, 0 replies; 16+ messages in thread
From: Masahiro Yamada @ 2024-11-20 2:37 UTC (permalink / raw)
To: linux-kbuild; +Cc: Nathan Chancellor, Nicolas Schier, linux-kernel
On Wed, Nov 20, 2024 at 8:57 AM Masahiro Yamada <masahiroy@kernel.org> wrote:
>
> The generic ->do_entry() handler is currently limited to returning
> a single alias string.
>
> However, this is not flexible enough for several subsystems, which
> currently require their own implementations:
>
> - do_usb_table()
> - do_of_table()
> - do_pnp_device_entry()
> - do_pnp_card_entries()
>
> This commit introduces a helper function so that these special cases can
> add multiple MODULE_ALIAS() and then migrate to the generic framework.
>
> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
> ---
>
> scripts/mod/file2alias.c | 89 +++++++++++++++++++++++++++++-----------
> scripts/mod/modpost.c | 11 ++++-
> scripts/mod/modpost.h | 19 ++++++++-
> 3 files changed, 91 insertions(+), 28 deletions(-)
>
> diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
> index 34678ed40fdb..e31619cee05e 100644
> --- a/scripts/mod/file2alias.c
> +++ b/scripts/mod/file2alias.c
> @@ -10,6 +10,12 @@
> * of the GNU General Public License, incorporated herein by reference.
> */
>
> +#include <stdarg.h>
> +#include <stdio.h>
> +
> +#include "list.h"
> +#include "xalloc.h"
> +
> #include "modpost.h"
> #include "devicetable-offsets.h"
>
> @@ -31,6 +37,56 @@ typedef Elf64_Addr kernel_ulong_t;
> #include <ctype.h>
> #include <stdbool.h>
>
> +/**
> + * module_alias_printf - add auto-generated MODULE_ALIAS()
> + *
> + * @mod: module
> + * @append_wildcard: append '*' for future extension if not exist yet
> + * @fmt: printf(3)-like format
> + */
> +static void __attribute__((format (printf, 3, 4)))
> +module_alias_printf(struct module *mod, bool append_wildcard,
> + const char *fmt, ...)
> +{
> + struct module_alias *new;
> + size_t len, n;
> + va_list ap;
> +
> + /* Determine required size. */
> + va_start(ap, fmt);
> + n = vsnprintf(NULL, 0, fmt, ap);
> + va_end(ap);
> +
> + if (n < 0) {
> + error("vsnprintf failed\n");
> + return;
> + }
> +
> + len = n + 1; /* extra byte for '\0' */
> +
> + if (append_wildcard)
> + len++; /* extra byte for '*' */
> +
> + new = xmalloc(sizeof(*new) + len);
> +
> + /* Now, really print it to the allocated buffer */
> + va_start(ap, fmt);
> + n = vsnprintf(new->str, len, fmt, ap);
> + va_end(ap);
> +
> + if (n < 0) {
> + error("vsnprintf failed\n");
> + return;
This is a memory leak bug.
I will add free() here.
if (n < 0) {
error("vsnprintf failed\n");
+ free(new);
return;
}
--
Best Regards
Masahiro Yamada
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2024-11-20 2:38 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-19 23:56 [PATCH 01/15] modpost: remove incorrect code in do_eisa_entry() Masahiro Yamada
2024-11-19 23:56 ` [PATCH 02/15] modpost: remove unnecessary check in do_acpi_entry() Masahiro Yamada
2024-11-19 23:56 ` [PATCH 03/15] modpost: introduce module_alias_printf() helper Masahiro Yamada
2024-11-20 2:37 ` Masahiro Yamada
2024-11-19 23:56 ` [PATCH 04/15] modpost: deduplicate MODULE_ALIAS() for all drivers Masahiro Yamada
2024-11-19 23:56 ` [PATCH 05/15] modpost: remove DEF_FIELD_ADDR_VAR() macro Masahiro Yamada
2024-11-19 23:56 ` [PATCH 06/15] modpost: pass (struct module *) to do_*_entry() functions Masahiro Yamada
2024-11-19 23:56 ` [PATCH 07/15] modpost: call module_alias_printf() from all " Masahiro Yamada
2024-11-19 23:56 ` [PATCH 08/15] modpost: convert do_pnp_card_entries() to a generic handler Masahiro Yamada
2024-11-19 23:56 ` [PATCH 09/15] modpost: convert do_pnp_device_entry() " Masahiro Yamada
2024-11-19 23:56 ` [PATCH 10/15] modpost: convert do_of_table() " Masahiro Yamada
2024-11-19 23:56 ` [PATCH 11/15] modpost: convert do_usb_table() " Masahiro Yamada
2024-11-19 23:56 ` [PATCH 12/15] modpost: move strstarts() to modpost.h Masahiro Yamada
2024-11-19 23:56 ` [PATCH 13/15] modpost: rename variables in handle_moddevtable() Masahiro Yamada
2024-11-19 23:56 ` [PATCH 14/15] modpost: rename alias symbol for MODULE_DEVICE_TABLE() Masahiro Yamada
2024-11-19 23:56 ` [PATCH 15/15] modpost: improve error messages in device_id_check() Masahiro Yamada
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox