• Chuck Lever's avatar
    NFSD: Fix "start of NFS reply" pointer passed to nfsd_cache_update() · 1caf5f61
    Chuck Lever authored
    The "statp + 1" pointer that is passed to nfsd_cache_update() is
    supposed to point to the start of the egress NFS Reply header. In
    fact, it does point there for AUTH_SYS and RPCSEC_GSS_KRB5 requests.
    
    But both krb5i and krb5p add fields between the RPC header's
    accept_stat field and the start of the NFS Reply header. In those
    cases, "statp + 1" points at the extra fields instead of the Reply.
    The result is that nfsd_cache_update() caches what looks to the
    client like garbage.
    
    A connection break can occur for a number of reasons, but the most
    common reason when using krb5i/p is a GSS sequence number window
    underrun. When an underrun is detected, the server is obliged to
    drop the RPC and the connection to force a retransmit with a fresh
    GSS sequence number. The client presents the same XID, it hits in
    the server's DRC, and the server returns the garbage cache entry.
    
    The "statp + 1" argument has been used since the oldest changeset
    in the kernel history repo, so it has been in nfsd_dispatch()
    literally since before history began. The problem arose only when
    the server-side GSS implementation was added twenty years ago.
    Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
    Tested-by: Jeff Layton <jlayton@kernel.org
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    1caf5f61
nfssvc.c 26.8 KB