Skip to content
  • Yuanhan Liu's avatar
    printk: use mutex lock to stop syslog_seq from going wild · 4a77a5a0
    Yuanhan Liu authored
    
    
    Although syslog_seq and log_next_seq stuff are protected by logbuf_lock
    spin log, it's not enough. Say we have two processes A and B, and let
    syslog_seq = N, while log_next_seq = N + 1, and the two processes both
    come to syslog_print at almost the same time. And No matter which
    process get the spin lock first, it will increase syslog_seq by one,
    then release spin lock; thus later, another process increase syslog_seq
    by one again. In this case, syslog_seq is bigger than syslog_next_seq.
    And latter, it would make:
       wait_event_interruptiable(log_wait, syslog != log_next_seq)
    don't wait any more even there is no new write comes. Thus it introduce
    a infinite loop reading.
    
    I can easily see this kind of issue by the following steps:
      # cat /proc/kmsg # at meantime, I don't kill rsyslog
                       # So they are the two processes.
      # xinit          # I added drm.debug=6 in the kernel parameter line,
                       # so that it will produce lots of message and let that
                       # issue happen
    
    It's 100% reproducable on my side. And my disk will be filled up by
    /var/log/messages in a quite short time.
    
    So, introduce a mutex_lock to stop syslog_seq from going wild just like
    what devkmsg_read() does. It does fix this issue as expected.
    
    v2: use mutex_lock_interruptiable() instead (comments from Kay)
    
    Signed-off-by: default avatarYuanhan Liu <yuanhan.liu@linux.intel.com>
    Reviewed-by: default avatarFengguang Wu <fengguang.wu@intel.com>
    Acked-By: default avatarKay Sievers <kay@vrfy.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    4a77a5a0