Patch "nfsd: encoders mustn't use unitialized values in error cases" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
nfsd: encoders mustn't use unitialized values in error cases
to the 4.4-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:
nfsd-encoders-mustn-t-use-unitialized-values-in-error-cases.patch
and it can be found in the queue-4.4 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
f961e3f2acae94b727380c0b74e2d3954d0edf79Mon Sep 17 00:00:00 2001
From: "J. Bruce Fields" <[email protected]>
Date: Fri, 5 May 2017 16:17:57 -0400
Subject: nfsd: encoders mustn't use unitialized values in error cases
From: J. Bruce Fields <[email protected]>
commit f961e3f2acae94b727380c0b74e2d3954d0edf79 upstream.
In error cases, lgp->lg_layout_type may be out of bounds; so we shouldn't be using it until after the check of nfserr.
This was seen to crash nfsd threads when the server receives a LAYOUTGET request with a large layout type.
GETDEVICEINFO has the same problem.
--- fs/nfsd/nfs4xdr.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
fs/nfsd/nfs4xdr.c +4 -4
@@ -4041,8 +4041,7 @@ nfsd4_encode_getdeviceinfo(struct nfsd4_ struct nfsd4_getdeviceinfo *gdev) {struct xdr_stream *xdr = &resp->xdr; -const struct nfsd4_layout_ops *ops = - nfsd4_layout_ops[gdev->gd_layout_type]; +const struct nfsd4_layout_ops *ops;u32 starting_len = xdr->buf->len, needed_len;__be32 *p;
@@ -4059,6 +4058,7 @@ nfsd4_encode_getdeviceinfo(struct nfsd4_/* If maxcount is 0 then just update notifications */ if (gdev->gd_maxcount !=0 ) { + ops = nfsd4_layout_ops[gdev->gd_layout_type]; nfserr = ops->encode_getdeviceinfo (xdr, gdev);if (nfserr) {/*
@@ -4111,8 +4111,7 @@ nfsd4_encode_layoutget(struct nfsd4_comp struct nfsd4_layoutget *lgp) {struct xdr_stream *xdr = &resp->xdr; -const struct nfsd4_layout_ops *ops = - nfsd4_layout_ops[lgp->lg_layout_type]; +const struct nfsd4_layout_ops *ops;__be32 *p;dprintk ("%s: err %d\n" , __func__, nfserr);
@@ -4135,6 +4134,7 @@ nfsd4_encode_layoutget(struct nfsd4_comp *p++ =cpu_to_be32 (lgp->lg_seg.iomode); *p++ =cpu_to_be32 (lgp->lg_layout_type); + ops = nfsd4_layout_ops[lgp->lg_layout_type]; nfserr = ops->encode_layoutget (xdr, lgp); out:kfree (lgp->lg_content);
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/nfsd-check-for-oversized-nfsv2-v3-arguments.patch queue-4.4/nfsd-encoders-mustn-t-use-unitialized-values-in-error-cases.patch queue-4.4/nfsd-fix-up-the-supattr_exclcreat-attributes.patch