From: Mauricio Faria de Oliveira <mfo@igalia.com>
To: sashiko-reviews@lists.linux.dev
Cc: bpf@vger.kernel.org, Vasily Gorbik <gor@linux.ibm.com>,
Alexander Gordeev <agordeev@linux.ibm.com>,
linux-s390@vger.kernel.org, Heiko Carstens <hca@linux.ibm.com>,
Christian Borntraeger <borntraeger@linux.ibm.com>,
mptcp@lists.linux.dev
Subject: Re: [PATCH RFC v2 13/13] modpost: handle MODULE_SYSCTL_TABLE symbols
Date: Wed, 19 Aug 2026 13:29:24 -0300 [thread overview]
Message-ID: <10d22abac939ce0b2c8784cd84e9c073@igalia.com> (raw)
In-Reply-To: <20260819024854.392F71F000E9@smtp.kernel.org>
On 2026-08-18 23:48, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
> - [High] Double addition of `sym->st_value` causes `modpost` to read sysctl table pointers from incorrect offsets on ARM and other architectures utilizing `SHT_REL`.
The cross-compile tests had consistent output between e.g., ARM and
other architectures. I'll take a look later.
> - [Medium] The sysctl table entries processing aborts iteration upon encountering a relocation offset beyond the table's bounds, invalidly assuming ELF relocations are strictly sorted.
The cross-compile tests had consistent output among all architectures,
thus this doesn't seem to be a problem. Assuming that table entries
might have non-sequential/non-sorted relocations would probably incur
significant design changes, which doesn't seem worth it or required at
this point.
> - [Low] The string replacement loop in `do_sysctl_entry()` skips the character immediately following a '%' without bounds checking, leading to an out-of-bounds read.
Fixed.
> - [Low] The `entry_size` field parsed from the ELF file is used as a divisor without zero verification, allowing a malformed module to trigger a division-by-zero crash in `modpost`.
Fixed.
> --
>
> --- Patch [13]: [PATCH RFC v2 13/13] modpost: handle MODULE_SYSCTL_TABLE symbols ---
> commit 75e261ee7e3ce69bb021a98d7b4574fdc959ec34
> Author: Mauricio Faria de Oliveira <mfo@igalia.com>
>
> modpost: handle MODULE_SYSCTL_TABLE symbols
>
> Update file2alias.c to handle 'mod_devicetable' symbols with type 'sysctl'.
> The key operation is to iterate over relocation entries and add module aliases
> for each entry.
>
>> diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
>> index 8d36c74dec2d5..797cfc2f478e2 100644
>> --- a/scripts/mod/file2alias.c
>> +++ b/scripts/mod/file2alias.c
>> @@ -1531,6 +1531,231 @@ static const struct devtable devtable[] = {
>
> [ ... ]
>
>> +// Looks like: sysctl:*/path/procname
>> +static void do_sysctl_entry(const char *procname, const char *path,
>> + struct module *mod)
>> +{
>> + const char *src;
>> + char *dst, buf[256], *end = buf + sizeof(buf) - 1; /* -1 for NUL byte */
>> +
>> + /* Replace '%s' from path template with '*' for wildcard in modprobe. */
>> + for (src = path, dst = buf; *src && dst < end; src++, dst++)
>> + *dst = (*src == '%') ? (src++, '*') : *src;
>
> [Severity: Low]
> Does this loop advance past the end of the string if the path ends exactly
> with a '%' character?
>
> If *src is '%', the inline ternary operator does a src++. Then the loop's
> update step does another src++, which would skip the NUL terminator and lead
> to an out-of-bounds read on the next iteration.
>
>> + *dst = '\0';
>> +
>> + module_alias_printf(mod, false, "sysctl:*/%s/%s", buf, procname);
>> +}
>
> [ ... ]
>
>> +static bool do_sysctl_entries(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Sym *sym,
>> + Elf_Addr r_offset, Elf_Addr r_addend, void *data)
>> +{
>> + struct sysctl_entries *sysctl_entries = (struct sysctl_entries *) data;
>> +
>> + /* Skip until .table starts */
>> + if (r_offset < sysctl_entries->table_offset)
>> + return false;
>> +
>> + /* Stop after .table ends */
>> + if (r_offset >= sysctl_entries->table_offset + sysctl_entries->table_size)
>> + return true;
>
> [Severity: Medium]
> Is it safe to assume that relocation entries in the ELF section are strictly
> sorted by r_offset?
>
> By returning true here, the loop over relocation entries is aborted. The ELF
> specification does not guarantee strict sorting by offset. If a linker emits
> an out-of-order relocation entry earlier in the section but pointing past the
> table, could this prematurely abort the traversal and miss valid entries?
>
>> +
>> + /* Check for alignment with an array entry (.procname at offset zero) */
>> + if ((r_offset - sysctl_entries->table_offset) % sysctl_entries->entry_size == 0) {
>
> [Severity: Low]
> Can entry_size be zero here?
>
> Since entry_size is parsed directly from the ELF module, a malformed module
> with a size of 0 could trigger a division-by-zero crash in modpost.
>
>> +
>> + /* The symbol for .procname points to a string */
>> + const char *procname = (const char *)
>> + sym_get_data_addend(elf, sym, r_addend);
>
> [ ... ]
>
>> diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
>> index d18a87b882a67..10eb7273cdd81 100644
>> --- a/scripts/mod/modpost.c
>> +++ b/scripts/mod/modpost.c
>> @@ -340,6 +340,13 @@ void *sym_get_data(const struct elf_info *info, const Elf_Sym *sym)
>> sym->st_value);
>> }
>>
>> +void *sym_get_data_addend(const struct elf_info *info, const Elf_Sym *sym,
>> + Elf_Addr r_addend)
>> +{
>> + return sym_get_data_by_offset(info, get_secindex(info, sym),
>> + sym->st_value + r_addend);
>> +}
>
> [Severity: High]
> Does this result in adding sym->st_value twice on architectures like ARM
> that use SHT_REL?
>
> In for_each_reloc(), r_addend is calculated using addend_rel(). On ARM,
> addend_rel() already returns the instruction value plus sym->st_value.
>
> If sym->st_value is added again here (and in the manual table_offset
> calculation in do_sysctl_table()), modpost will read from the wrong
> offset, silently failing to extract .procname and missing the module
> aliases.
--
Mauricio
prev parent reply other threads:[~2026-08-19 16:29 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-19 2:27 [PATCH RFC v2 00/13] sysctl: add module aliases Mauricio Faria de Oliveira
2026-08-19 2:27 ` Mauricio Faria de Oliveira
2026-08-19 2:28 ` [PATCH RFC v2 01/13] keys, pidns, fs/verity, riscv/vector: reorder '#include <linux/sysctl.h>' Mauricio Faria de Oliveira
2026-08-19 2:28 ` Mauricio Faria de Oliveira
2026-08-19 2:33 ` sashiko-bot
2026-08-19 2:28 ` [PATCH RFC v2 02/13] proc: add config option SYSCTL_MODULE_ALIASES Mauricio Faria de Oliveira
2026-08-19 2:28 ` Mauricio Faria de Oliveira
2026-08-19 2:37 ` sashiko-bot
2026-08-19 16:24 ` Mauricio Faria de Oliveira
2026-08-19 2:28 ` [PATCH RFC v2 03/13] sysctl, mod_devicetable: add macro MODULE_SYSCTL_TABLE Mauricio Faria de Oliveira
2026-08-19 2:28 ` Mauricio Faria de Oliveira
2026-08-19 2:40 ` sashiko-bot
2026-08-19 16:26 ` Mauricio Faria de Oliveira
2026-08-19 2:28 ` [PATCH RFC v2 04/13] sysctl: add register_sysctl() wrapper for MODULE_SYSCTL_TABLE Mauricio Faria de Oliveira
2026-08-19 2:28 ` Mauricio Faria de Oliveira
2026-08-19 2:44 ` sashiko-bot
2026-08-19 16:25 ` Mauricio Faria de Oliveira
2026-08-19 2:28 ` [PATCH RFC v2 05/13] sysctl, parport: update register_sysctl() callers with template arguments Mauricio Faria de Oliveira
2026-08-19 2:28 ` Mauricio Faria de Oliveira
2026-08-19 2:44 ` sashiko-bot
2026-08-19 16:25 ` Mauricio Faria de Oliveira
2026-08-19 2:28 ` [PATCH RFC v2 06/13] sysctl, net: add register_net_sysctl{_sz}() wrappers for MODULE_SYSCTL_TABLE Mauricio Faria de Oliveira
2026-08-19 2:28 ` Mauricio Faria de Oliveira
2026-08-19 2:40 ` sashiko-bot
2026-08-19 16:25 ` Mauricio Faria de Oliveira
2026-08-19 2:28 ` [PATCH RFC v2 07/13] sysctl, net: update register_net_sysctl{_sz}() callers with template arguments Mauricio Faria de Oliveira
2026-08-19 2:28 ` Mauricio Faria de Oliveira
2026-08-19 2:48 ` sashiko-bot
2026-08-19 16:25 ` Mauricio Faria de Oliveira
2026-08-19 2:28 ` [PATCH RFC v2 08/13] sysctl, net: update register_net_sysctl_sz(ARRAY_SIZE(table_tmpl)) " Mauricio Faria de Oliveira
2026-08-19 2:28 ` Mauricio Faria de Oliveira
2026-08-19 2:36 ` sashiko-bot
2026-08-19 2:28 ` [PATCH RFC v2 09/13] sysctl, ipv6: update register_net_sysctl{_sz}() callers " Mauricio Faria de Oliveira
2026-08-19 2:28 ` Mauricio Faria de Oliveira
2026-08-19 2:36 ` sashiko-bot
2026-08-19 2:28 ` [PATCH RFC v2 10/13] sysctl, net: update register_net_sysctl_sz() edge case Mauricio Faria de Oliveira
2026-08-19 2:28 ` Mauricio Faria de Oliveira
2026-08-19 2:39 ` sashiko-bot
2026-08-19 2:28 ` [PATCH RFC v2 11/13] sysctl: unrandomize struct ctl_table.procname Mauricio Faria de Oliveira
2026-08-19 2:28 ` Mauricio Faria de Oliveira
2026-08-19 2:38 ` sashiko-bot
2026-08-19 2:28 ` [PATCH RFC v2 12/13] modpost: move addend_*_rel() calls into addend_rel() Mauricio Faria de Oliveira
2026-08-19 2:28 ` Mauricio Faria de Oliveira
2026-08-19 2:39 ` sashiko-bot
2026-08-19 2:28 ` [PATCH RFC v2 13/13] modpost: handle MODULE_SYSCTL_TABLE symbols Mauricio Faria de Oliveira
2026-08-19 2:28 ` Mauricio Faria de Oliveira
2026-08-19 2:48 ` sashiko-bot
2026-08-19 16:29 ` Mauricio Faria de Oliveira [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=10d22abac939ce0b2c8784cd84e9c073@igalia.com \
--to=mfo@igalia.com \
--cc=agordeev@linux.ibm.com \
--cc=borntraeger@linux.ibm.com \
--cc=bpf@vger.kernel.org \
--cc=gor@linux.ibm.com \
--cc=hca@linux.ibm.com \
--cc=linux-s390@vger.kernel.org \
--cc=mptcp@lists.linux.dev \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.