• Rasmus Villemoes's avatar
    tools/nolibc/string: Fix memcmp() implementation · b3f4f51e
    Rasmus Villemoes authored
    The C standard says that memcmp() must treat the buffers as consisting
    of "unsigned chars". If char happens to be unsigned, the casts are ok,
    but then obviously the c1 variable can never contain a negative
    value. And when char is signed, the casts are wrong, and there's still
    a problem with using an 8-bit quantity to hold the difference, because
    that can range from -255 to +255.
    
    For example, assuming char is signed, comparing two 1-byte buffers,
    one containing 0x00 and another 0x80, the current implementation would
    return -128 for both memcmp(a, b, 1) and memcmp(b, a, 1), whereas one
    of those should of course return something positive.
    Signed-off-by: default avatarRasmus Villemoes <linux@rasmusvillemoes.dk>
    Fixes: 66b6f755 ("rcutorture: Import a copy of nolibc")
    Cc: stable@vger.kernel.org # v5.0+
    Signed-off-by: default avatarWilly Tarreau <w@1wt.eu>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    b3f4f51e
string.h 5.04 KB