• J
    cifs: prevent cifsd from exiting prematurely · 522bbe65
    Jeff Layton 提交于
    When cifs_demultiplex_thread exits, it does a number of cleanup tasks
    including freeing the TCP_Server_Info struct. Much of the existing code
    in cifs assumes that when there is a cisfSesInfo struct, that it holds a
    reference to a valid TCP_Server_Info struct.
    
    We can never allow cifsd to exit when a cifsSesInfo struct is still
    holding a reference to the server. The server pointers will then point
    to freed memory.
    
    This patch eliminates a couple of questionable conditions where it does
    this.  The idea here is to make an -EINTR return from kernel_recvmsg
    behave the same way as -ERESTARTSYS or -EAGAIN. If the task was
    signalled from cifs_put_tcp_session, then tcpStatus will be CifsExiting,
    and the kernel_recvmsg call will return quickly.
    
    There's also another condition where this can occur too -- if the
    tcpStatus is still in CifsNew, then it will also exit if the server
    closes the socket prematurely.  I think we'll probably also need to fix
    that situation, but that requires a bit more consideration.
    Signed-off-by: NJeff Layton <jlayton@redhat.com>
    Signed-off-by: NSteve French <sfrench@us.ibm.com>
    522bbe65
connect.c 85.5 KB