• Rasmus Villemoes's avatar
    lib/test_printf.c: split write-beyond-buffer check in two · 9a3bfa01
    Rasmus Villemoes authored
    Before each invocation of vsnprintf(), do_test() memsets the entire
    allocated buffer to a sentinel value. That buffer includes leading and
    trailing padding which is never included in the buffer area handed to
    vsnprintf (spaces merely for clarity):
    
      pad  test_buffer      pad
      **** **************** ****
    
    Then vsnprintf() is invoked with a bufsize argument <=
    BUF_SIZE. Suppose bufsize=10, then we'd have e.g.
    
     |pad |   test_buffer    |pad |
      **** pizza0 **** ****** ****
     A    B      C    D           E
    
    where vsnprintf() was given the area from B to D.
    
    It is obviously a bug for vsnprintf to touch anything between A and B
    or between D and E. The former is checked for as one would expect. But
    for the latter, we are actually a little stricter in that we check the
    area between C and E.
    
    Split that check in two, providing a clearer error message in case it
    was a genuine buffer overrun and not merely a write within the
    provided buffer, but after the end of the generated string.
    
    So far, no part of the vsnprintf() implementation has had any use for
    using the whole buffer as scratch space, but it's not unreasonable to
    allow that, as long as the result is properly nul-terminated and the
    return value is the right one. However, it is somewhat unusual, and
    most %<something> won't need this, so keep the [C,D] check, but make
    it easy for a later patch to make that part opt-out for certain tests.
    Signed-off-by: default avatarRasmus Villemoes <linux@rasmusvillemoes.dk>
    Tested-by: default avatarJia He <justin.he@arm.com>
    Signed-off-by: default avatarJia He <justin.he@arm.com>
    Reviewed-by: default avatarPetr Mladek <pmladek@suse.com>
    Signed-off-by: default avatarPetr Mladek <pmladek@suse.com>
    Link: https://lore.kernel.org/r/20210615154952.2744-4-justin.he@arm.com
    9a3bfa01
test_printf.c 18.9 KB