~registry/kmod/master

« back to all changes in this revision

Viewing changes to libkmod/libkmod-module.c

  • Committer: Lucas De Marchi
  • Author(s): Dmitry Antipov
  • Date: 2023-05-30 19:56:54 UTC
  • Revision ID: git-v1:badacf76e46b3602bc0e99ffc677ccbe53691f62
libkmod: fix possible out-of-bounds memory access

An attempt to pass too long module name to, say, rmmod, may
cause an out-of-bounds memory access (as repoted by UBSan):

$ rmmod $(for i in $(seq 0 4200); do echo -ne x; done)
libkmod/libkmod-module.c:1828:8: runtime error: index 4107 out of bounds for type 'char [4096]'

This is because 'snprintf(path, sizeof(path), ...)' may return the
value which exceeds 'sizeof(path)' (which happens when an output
gets truncated). To play it safe, such a suspicious output is
better to be rejected explicitly.

Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
Link: https://lore.kernel.org/r/20230519074638.402045-1-dmantipov@yandex.ru

Show diffs side-by-side

added added

removed removed

Lines of Context:
1810
1810
 
1811
1811
        pathlen = snprintf(path, sizeof(path),
1812
1812
                                "/sys/module/%s/initstate", mod->name);
 
1813
        if (pathlen >= (int)sizeof(path)) {
 
1814
                /* Too long path was truncated */
 
1815
                return -ENAMETOOLONG;
 
1816
        }
1813
1817
        fd = open(path, O_RDONLY|O_CLOEXEC);
1814
1818
        if (fd < 0) {
1815
1819
                err = -errno;