• Alexandre SIMON's avatar
    printk: fix buffer overflow when calling log_prefix function from call_console_drivers · ce0030c0
    Alexandre SIMON authored
    This patch corrects a buffer overflow in kernels from 3.0 to 3.4 when calling
    log_prefix() function from call_console_drivers().
    
    This bug existed in previous releases but has been revealed with commit
    162a7e75 (2.6.39 => 3.0) that made changes
    about how to allocate memory for early printk buffer (use of memblock_alloc).
    It disappears with commit 7ff9554b (3.4 => 3.5)
    that does a refactoring of printk buffer management.
    
    In log_prefix(), the access to "p[0]", "p[1]", "p[2]" or
    "simple_strtoul(&p[1], &endp, 10)" may cause a buffer overflow as this
    function is called from call_console_drivers by passing "&LOG_BUF(cur_index)"
    where the index must be masked to do not exceed the buffer's boundary.
    
    The trick is to prepare in call_console_drivers() a buffer with the necessary
    data (PRI field of syslog message) to be safely evaluated in log_prefix().
    
    This patch can be applied to stable kernel branches 3.0.y, 3.2.y and 3.4.y.
    
    Without this patch, one can freeze a server running this loop from shell :
      $ export DUMMY=`cat /dev/urandom | tr -dc '12345AZERTYUIOPQSDFGHJKLMWXCVBNazertyuiopqsdfghjklmwxcvbn' | head -c255`
      $ while true do ; echo $DUMMY > /dev/kmsg ; done
    
    The "server freeze" depends on where memblock_alloc does allocate printk buffer :
    if the buffer overflow is inside another kernel allocation the problem may not
    be revealed, else the server may hangs up.
    Signed-off-by: default avatarAlexandre SIMON <Alexandre.Simon@univ-lorraine.fr>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ce0030c0
printk.c 44.9 KB