• Masahiro Yamada's avatar
    modpost: fix broken sym->namespace for external module builds · 389eb3f5
    Masahiro Yamada authored
    Currently, external module builds produce tons of false-positives:
    
      WARNING: module <mod> uses symbol <sym> from namespace <ns>, but does not import it.
    
    Here, the <ns> part shows a random string.
    
    When you build external modules, the symbol info of vmlinux and
    in-kernel modules are read from $(objtree)/Module.symvers, but
    read_dump() is buggy in multiple ways:
    
    [1] When the modpost is run for vmlinux and in-kernel modules,
    sym_extract_namespace() allocates memory for the namespace. On the
    other hand, read_dump() does not, then sym->namespace will point to
    somewhere in the line buffer of get_next_line(). The data in the
    buffer will be replaced soon, and sym->namespace will end up with
    pointing to unrelated data. As a result, check_exports() will show
    random strings in the warning messages.
    
    [2] When there is no namespace, sym_extract_namespace() returns NULL.
    On the other hand, read_dump() sets namespace to an empty string "".
    (but, it will be later replaced with unrelated data due to bug [1].)
    The check_exports() shows a warning unless exp->namespace is NULL,
    so every symbol read from read_dump() emits the warning, which is
    mostly false positive.
    
    To address [1], sym_add_exported() calls strdup() for s->namespace.
    The namespace from sym_extract_namespace() must be freed to avoid
    memory leak.
    
    For [2], I changed the if-conditional in check_exports().
    
    This commit also fixes sym_add_exported() to set s->namespace correctly
    when the symbol is preloaded.
    Reviewed-by: default avatarMatthias Maennich <maennich@google.com>
    Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
    Signed-off-by: default avatarJessica Yu <jeyu@kernel.org>
    389eb3f5
modpost.c 69 KB