Patch "NFS: Fix 2 use after free issues in the I/O code" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
NFS: Fix 2 use after free issues in the I/O code
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
nfs-fix-2-use-after-free-issues-in-the-i-o-code.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
196639ebbe63a037fe9a80669140bd292d8bcd80Mon Sep 17 00:00:00 2001
From: Trond Myklebust <[email protected]>
Date: Fri, 8 Sep 2017 21:28:11 -0400
Subject: NFS: Fix 2 use after free issues in the I/O code
From: Trond Myklebust <[email protected]>
commit 196639ebbe63a037fe9a80669140bd292d8bcd80 upstream.
The writeback code wants to send a commit after processing the pages, which is why we want to delay releasing the struct path until after that's done.
Also, the layout code expects that we do not free the inode before we've put the layout segments in pnfs_writehdr_free() and pnfs_readhdr_free()
--- fs/nfs/internal.h | 1 - fs/nfs/pagelist.c | 26 ++++++++++++-------------- fs/nfs/pnfs.c | 2 -- 3 files changed, 12 insertions(+), 17 deletions(-)
fs/nfs/internal.h +0 -1
@@ -248,7 +248,6 @@ int nfs_iocounter_wait(struct nfs_lock_cextern const struct nfs_pageio_ops nfs_pgio_rw_ops;struct nfs_pgio_header *nfs_pgio_header_alloc (const struct nfs_rw_ops *);void nfs_pgio_header_free (struct nfs_pgio_header *); -void nfs_pgio_data_destroy (struct nfs_pgio_header *);int nfs_generic_pgio (struct nfs_pageio_descriptor *,struct nfs_pgio_header *); int nfs_initiate_pgio(struct rpc_clnt *clnt, struct nfs_pgio_header *hdr, struct rpc_cred *cred, const struct nfs_rpc_ops *rpc_ops,
fs/nfs/pagelist.c +12 -14
@@ -497,16 +497,6 @@ struct nfs_pgio_header *nfs_pgio_header_ }EXPORT_SYMBOL_GPL (nfs_pgio_header_alloc); -/* -* nfs_pgio_header_free - Free a read or write header -* @hdr: The header to free -*/ -void nfs_pgio_header_free (struct nfs_pgio_header *hdr) -{ - hdr->rw_ops->rw_free_header (hdr); -} -EXPORT_SYMBOL_GPL (nfs_pgio_header_free); -/** * nfs_pgio_data_destroy - make @hdr suitable for reuse *
@@ -515,14 +505,24 @@ EXPORT_SYMBOL_GPL(nfs_pgio_header_free);* * @hdr: A header that has had nfs_generic_pgio called */ -void nfs_pgio_data_destroy (struct nfs_pgio_header *hdr) +static void nfs_pgio_data_destroy (struct nfs_pgio_header *hdr) {if (hdr->args.context)put_nfs_open_context (hdr->args.context);if (hdr->page_array.pagevec != hdr->page_array.page_array)kfree (hdr->page_array.pagevec); } -EXPORT_SYMBOL_GPL (nfs_pgio_data_destroy); + +/* +* nfs_pgio_header_free - Free a read or write header +* @hdr: The header to free +*/ +void nfs_pgio_header_free (struct nfs_pgio_header *hdr) +{ +nfs_pgio_data_destroy (hdr); + hdr->rw_ops->rw_free_header (hdr); +} +EXPORT_SYMBOL_GPL (nfs_pgio_header_free);/** * nfs_pgio_rpcsetup - Set up arguments for a pageio call
@@ -636,7 +636,6 @@ EXPORT_SYMBOL_GPL(nfs_initiate_pgio);static void nfs_pgio_error (struct nfs_pgio_header *hdr) {set_bit (NFS_IOHDR_REDO , &hdr->flags); -nfs_pgio_data_destroy (hdr); hdr->completion_ops->completion (hdr); }
@@ -647,7 +646,6 @@ static void nfs_pgio_error(struct nfs_pgstatic void nfs_pgio_release (void *calldata) {struct nfs_pgio_header *hdr = calldata; -nfs_pgio_data_destroy (hdr); hdr->completion_ops->completion (hdr); }
fs/nfs/pnfs.c +0 -2
@@ -2145,7 +2145,6 @@ pnfs_write_through_mds(struct nfs_pageionfs_pageio_reset_write_mds (desc); mirror->pg_recoalesce =1 ; } -nfs_pgio_data_destroy (hdr); hdr->release (hdr); }
@@ -2257,7 +2256,6 @@ pnfs_read_through_mds(struct nfs_pageio_nfs_pageio_reset_read_mds (desc); mirror->pg_recoalesce =1 ; } -nfs_pgio_data_destroy (hdr); hdr->release (hdr); }
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/nfs-fix-2-use-after-free-issues-in-the-i-o-code.patch queue-4.9/nfs-sync-the-correct-byte-range-during-synchronous-writes.patch