• Quentin Perret's avatar
    ehci-hcd: Move include to keep CRC stable · faf8af43
    Quentin Perret authored
    commit 29231826 upstream.
    
    The CRC calculation done by genksyms is triggered when the parser hits
    EXPORT_SYMBOL*() macros. At this point, genksyms recursively expands the
    types of the function parameters, and uses that as the input for the CRC
    calculation. In the case of forward-declared structs, the type expands
    to 'UNKNOWN'. Following this, it appears that the result of the
    expansion of each type is cached somewhere, and seems to be re-used
    when/if the same type is seen again for another exported symbol in the
    same C file.
    
    Unfortunately, this can cause CRC 'stability' issues when a struct
    definition becomes visible in the middle of a C file. For example, let's
    assume code with the following pattern:
    
        struct foo;
    
        int bar(struct foo *arg)
        {
    	/* Do work ... */
        }
        EXPORT_SYMBOL_GPL(bar);
    
        /* This contains struct foo's definition */
        #include "foo.h"
    
        int baz(struct foo *arg)
        {
    	/* Do more work ... */
        }
        EXPORT_SYMBOL_GPL(baz);
    
    Here, baz's CRC will be computed using the expansion of struct foo that
    was cached after bar's CRC calculation ('UNKOWN' here). But if
    EXPORT_SYMBOL_GPL(bar) is removed from the file (because of e.g. symbol
    trimming using CONFIG_TRIM_UNUSED_KSYMS), struct foo will be expanded
    late, during baz's CRC calculation, which now has visibility over the
    full struct definition, hence resulting in a different CRC for baz.
    
    The proper fix for this certainly is in genksyms, but that will take me
    some time to get right. In the meantime, we have seen one occurrence of
    this in the ehci-hcd code which hits this problem because of the way it
    includes C files halfway through the code together with an unlucky mix
    of symbol trimming.
    
    In order to workaround this, move the include done in ehci-hub.c early
    in ehci-hcd.c, hence making sure the struct definitions are visible to
    the entire file. This improves CRC stability of the ehci-hcd exports
    even when symbol trimming is enabled.
    Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: default avatarQuentin Perret <qperret@google.com>
    Link: https://lore.kernel.org/r/20200916171825.3228122-1-qperret@google.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    faf8af43
ehci-hub.c 36.4 KB