nfs4: fix discover_server_trunking use after free
authorWeston Andros Adamson <dros@primarydata.com>
Mon, 20 Jan 2014 03:45:36 +0000 (22:45 -0500)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 20 Jan 2014 23:08:06 +0000 (16:08 -0700)
If clp is new (cl_count = 1) and it matches another client in
nfs4_discover_server_trunking, the nfs_put_client will free clp before
->cl_preserve_clid is set.

Cc: stable@vger.kernel.org # 3.7+
Signed-off-by: Weston Andros Adamson <dros@primarydata.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/nfs4client.c

index 06e770ace07332b5d307928474c9b13da3166b6e..73d4ecda1e367e250378cb46f8fe79ad3533db11 100644 (file)
@@ -414,13 +414,11 @@ struct nfs_client *nfs4_init_client(struct nfs_client *clp,
        error = nfs4_discover_server_trunking(clp, &old);
        if (error < 0)
                goto error;
-       nfs_put_client(clp);
-       if (clp != old) {
-               clp->cl_preserve_clid = true;
-               clp = old;
-       }
 
-       return clp;
+       if (clp != old)
+               clp->cl_preserve_clid = true;
+       nfs_put_client(clp);
+       return old;
 
 error:
        nfs_mark_client_ready(clp, error);