]> git.ipfire.org Git - thirdparty/kernel/stable.git/blobdiff - fs/nfs/client.c
nfs: fix UAF on pathwalk running into umount
[thirdparty/kernel/stable.git] / fs / nfs / client.c
index 44eca51b28085d9deff764bfe6f9286388e93983..fbdc9ca80f714bdf3d3cad54e63d7c858612e5f1 100644 (file)
@@ -246,7 +246,7 @@ void nfs_free_client(struct nfs_client *clp)
        put_nfs_version(clp->cl_nfs_mod);
        kfree(clp->cl_hostname);
        kfree(clp->cl_acceptor);
-       kfree(clp);
+       kfree_rcu(clp, rcu);
 }
 EXPORT_SYMBOL_GPL(nfs_free_client);
 
@@ -1006,6 +1006,14 @@ struct nfs_server *nfs_alloc_server(void)
 }
 EXPORT_SYMBOL_GPL(nfs_alloc_server);
 
+static void delayed_free(struct rcu_head *p)
+{
+       struct nfs_server *server = container_of(p, struct nfs_server, rcu);
+
+       nfs_free_iostats(server->io_stats);
+       kfree(server);
+}
+
 /*
  * Free up a server record
  */
@@ -1031,10 +1039,9 @@ void nfs_free_server(struct nfs_server *server)
 
        ida_destroy(&server->lockowner_id);
        ida_destroy(&server->openowner_id);
-       nfs_free_iostats(server->io_stats);
        put_cred(server->cred);
-       kfree(server);
        nfs_release_automount_timer();
+       call_rcu(&server->rcu, delayed_free);
 }
 EXPORT_SYMBOL_GPL(nfs_free_server);