• Linus Torvalds's avatar
    m68k: remove broken strcmp implementation · 7c084612
    Linus Torvalds authored
    The m68 hand-written assembler version of strcmp() has always been
    broken: it returns the difference between the first non-matching byte
    done as a 8-bit subtraction.
    
    That is _almost_ right, but is broken for the overflow case.  The
    strcmp() function should indeed return the sign of the difference
    between the first byte that differs, but the subtraction needs to be
    done in a wider type than 'char'.  Otherwise the ordering isn't actually
    stable.
    
    This went unnoticed for basically forever, because nobody ever cares
    about non-US-ASCII orderings in the kernel (in fact, most users only
    care about "exact match or not"), so overflows don't really happen in
    practice, even if it was very very wrong.
    
    But that mostly unnoticeable bug becomes very noticeable by the recent
    change to make 'char' be unsigned in the kernel across all architectures
    (commit 3bc753c0: "kbuild: treat char as always unsigned"). Because
    the code not only did the subtraction in the wrong type width, it also
    used 'char' to then make the compiler expand the result from an 8-bit
    difference to the 'int' return value.
    
    So now with an unsigned char that incorrect arithmetic width was then
    not even sign-expanded, and always returned just a positive integer.
    
    We could re-instate the old broken code by just turning the 'char' into
    'signed char' as has been done elsewhere where people depended on the
    signedness of 'char', but since the whole function was broken to begin
    with, and we have a non-broken default fallback implementation, let's
    just remove this broken function entirely.
    Reported-by: default avatarGuenter Roeck <linux@roeck-us.net>
    Link: https://lore.kernel.org/lkml/20221221145332.GA2399037@roeck-us.net/
    Cc: Jason Donenfeld <Jason@zx2c4.com>
    Cc: Geert Uytterhoeven <geert@linux-m68k.org>
    Cc: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    7c084612
string.h 1.19 KB