• Bruno Meneguele's avatar
    kernel/printk: add kmsg SEEK_CUR handling · 8ece3b3e
    Bruno Meneguele authored
    Userspace libraries, e.g. glibc's dprintf(), perform a SEEK_CUR operation
    over any file descriptor requested to make sure the current position isn't
    pointing to junk due to previous manipulation of that same fd. And whenever
    that fd doesn't have support for such operation, the userspace code expects
    -ESPIPE to be returned.
    
    However, when the fd in question references the /dev/kmsg interface, the
    current kernel code state returns -EINVAL instead, causing an unexpected
    behavior in userspace: in the case of glibc, when -ESPIPE is returned it
    gets ignored and the call completes successfully, while returning -EINVAL
    forces dprintf to fail without performing any action over that fd:
    
      if (_IO_SEEKOFF (fp, (off64_t)0, _IO_seek_cur, _IOS_INPUT|_IOS_OUTPUT) ==
      _IO_pos_BAD && errno != ESPIPE)
        return NULL;
    
    With this patch we make sure to return the correct value when SEEK_CUR is
    requested over kmsg and also add some kernel doc information to formalize
    this behavior.
    
    Link: https://lore.kernel.org/r/20200317103344.574277-1-bmeneg@redhat.com
    Cc: linux-kernel@vger.kernel.org
    Cc: rostedt@goodmis.org,
    Cc: David.Laight@ACULAB.COM
    Signed-off-by: default avatarBruno Meneguele <bmeneg@redhat.com>
    Acked-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Signed-off-by: default avatarPetr Mladek <pmladek@suse.com>
    8ece3b3e
printk.c 85.3 KB