Patch "nfsd4: fix bad bounds checking" has been added to the 4.5-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
nfsd4: fix bad bounds checking
to the 4.5-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:
nfsd4-fix-bad-bounds-checking.patch
and it can be found in the queue-4.5 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
4aed9c46afb80164401143aa0fdcfe3798baa9d5Mon Sep 17 00:00:00 2001
From: "J. Bruce Fields" <[email protected]>
Date: Mon, 29 Feb 2016 20:21:21 -0500
Subject: nfsd4: fix bad bounds checking
From: J. Bruce Fields <[email protected]>
commit 4aed9c46afb80164401143aa0fdcfe3798baa9d5 upstream.
A number of spots in the xdr decoding follow a pattern like
n = be32_to_cpup(p++); READ_BUF(n + 4);
where n is a u32. The only bounds checking is done in READ_BUF itself, but since it's checking (n + 4), it won't catch cases where n is very large, (u32)(-4) or higher. I'm not sure exactly what the consequences are, but we've seen crashes soon after.
Instead, just break these up into two READ_BUF()s.
--- fs/nfsd/nfs4xdr.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
fs/nfsd/nfs4xdr.c +8 -5
@@ -1072,8 +1072,9 @@ nfsd4_decode_rename(struct nfsd4_compounREAD_BUF (4 ); rename->rn_snamelen =be32_to_cpup (p++); -READ_BUF (rename->rn_snamelen +4 ); +READ_BUF (rename->rn_snamelen);SAVEMEM (rename->rn_sname, rename->rn_snamelen); +READ_BUF (4 ); rename->rn_tnamelen =be32_to_cpup (p++);READ_BUF (rename->rn_tnamelen);SAVEMEM (rename->rn_tname, rename->rn_tnamelen);
@@ -1155,13 +1156,14 @@ nfsd4_decode_setclientid(struct nfsd4_coREAD_BUF (8 ); setclientid->se_callback_prog =be32_to_cpup (p++); setclientid->se_callback_netid_len =be32_to_cpup (p++); - -READ_BUF (setclientid->se_callback_netid_len +4 ); +READ_BUF (setclientid->se_callback_netid_len);SAVEMEM (setclientid->se_callback_netid_val, setclientid->se_callback_netid_len); +READ_BUF (4 ); setclientid->se_callback_addr_len =be32_to_cpup (p++); -READ_BUF (setclientid->se_callback_addr_len +4 ); +READ_BUF (setclientid->se_callback_addr_len);SAVEMEM (setclientid->se_callback_addr_val, setclientid->se_callback_addr_len); +READ_BUF (4 ); setclientid->se_callback_ident =be32_to_cpup (p++);DECODE_TAIL ;
@@ -1835,8 +1837,9 @@ nfsd4_decode_compound(struct nfsd4_compoREAD_BUF (4 ); argp->taglen =be32_to_cpup (p++); -READ_BUF (argp->taglen +8 ); +READ_BUF (argp->taglen);SAVEMEM (argp->tag, argp->taglen); +READ_BUF (8 ); argp->minorversion =be32_to_cpup (p++); argp->opcnt =be32_to_cpup (p++); max_reply +=4 + (XDR_QUADLEN (argp->taglen) <<2 );
Patches currently in stable-queue which might be from [email protected] are
queue-4.5/nfsd-fix-deadlock-secinfo-readdir-compound.patch queue-4.5/nfsd4-fix-bad-bounds-checking.patch