• P
    printk: ignore too long messages · f40e4b9f
    Petr Mladek 提交于
    There was no check for too long messages.  The check for free space always
    passed when first_seq and next_seq were equal.  Enough free space was not
    guaranteed, though.
    
    log_store() might be called to store messages up to 64kB + 64kB + 16B.
    This is sum of maximal text_len, dict_len values, and the size of the
    structure printk_log.
    
    On the other hand, the minimal size for the main log buffer currently is
    4kB and it is enforced only by Kconfig.
    
    The good news is that the usage looks safe right now.  log_store() is
    called only from vprintk_emit() and cont_flush().  Here the "text" part is
    always passed via a static buffer and the length is limited to
    LOG_LINE_MAX which is 1024.  The "dict" part is NULL in most cases.  The
    only exceptions is when vprintk_emit() is called from printk_emit() and
    dev_vprintk_emit().  But printk_emit() is currently used only in
    devkmsg_writev() and here "dict" is NULL as well.  In dev_vprintk_emit(),
    "dict" is limited by the static buffer "hdr" of the size 128 bytes.  It
    meas that the current maximal printed text is 1024B + 128B + 16B and it
    always fit the log buffer.
    
    But it is only matter of time when someone calls printk_emit() with unsafe
    parameters, especially the "dict" one.
    
    This patch adds a check for the free space when the buffer is empty.  It
    reuses the already existing log_has_space() function but it has to add an
    extra parameter.  It defines whether the buffer is empty.  Note that the
    same values of "first_idx" and "next_idx" might also mean that the buffer
    is full.
    
    If the buffer is empty, we must respect the current position of the
    indexes.  We cannot reset them to the beginning of the buffer.  Otherwise,
    the functions reading the buffer would get crazy.
    
    The question is what to do when the message is too long.  This patch uses
    the easiest solution and just ignores the problematic message.  Let's do
    something better in a followup patch.
    Signed-off-by: NPetr Mladek <pmladek@suse.cz>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Jiri Kosina <jkosina@suse.cz>
    Cc: Kay Sievers <kay@vrfy.org>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    f40e4b9f
printk.c 73.1 KB