diff options
author | Andrea Parri (Microsoft) <parri.andrea@gmail.com> | 2021-02-03 12:36:02 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2021-02-17 11:02:26 +0100 |
commit | 8eb3e56fd180ca12a09586ca31a913646942eb0d (patch) | |
tree | 894706cac9ee8807acdce978b166c0c350901b9f | |
parent | 23b2eac8b76a13acec6d6e38d9f87bcaeda55a78 (diff) | |
download | kernel_replicant_linux-8eb3e56fd180ca12a09586ca31a913646942eb0d.tar.gz kernel_replicant_linux-8eb3e56fd180ca12a09586ca31a913646942eb0d.tar.bz2 kernel_replicant_linux-8eb3e56fd180ca12a09586ca31a913646942eb0d.zip |
hv_netvsc: Reset the RSC count if NVSP_STAT_FAIL in netvsc_receive()
[ Upstream commit 12bc8dfb83b5292fe387b795210018b7632ee08b ]
Commit 44144185951a0f ("hv_netvsc: Add validation for untrusted Hyper-V
values") added validation to rndis_filter_receive_data() (and
rndis_filter_receive()) which introduced NVSP_STAT_FAIL-scenarios where
the count is not updated/reset. Fix this omission, and prevent similar
scenarios from occurring in the future.
Reported-by: Juan Vazquez <juvazq@microsoft.com>
Signed-off-by: Andrea Parri (Microsoft) <parri.andrea@gmail.com>
Fixes: 44144185951a0f ("hv_netvsc: Add validation for untrusted Hyper-V values")
Reviewed-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Link: https://lore.kernel.org/r/20210203113602.558916-1-parri.andrea@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r-- | drivers/net/hyperv/netvsc.c | 5 | ||||
-rw-r--r-- | drivers/net/hyperv/rndis_filter.c | 2 |
2 files changed, 4 insertions, 3 deletions
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index 0c3de94b5178..6a7ab930ef70 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c @@ -1253,8 +1253,11 @@ static int netvsc_receive(struct net_device *ndev, ret = rndis_filter_receive(ndev, net_device, nvchan, data, buflen); - if (unlikely(ret != NVSP_STAT_SUCCESS)) + if (unlikely(ret != NVSP_STAT_SUCCESS)) { + /* Drop incomplete packet */ + nvchan->rsc.cnt = 0; status = NVSP_STAT_FAIL; + } } enq_receive_complete(ndev, net_device, q_idx, diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c index b22e47bcfeca..90bc0008fa2f 100644 --- a/drivers/net/hyperv/rndis_filter.c +++ b/drivers/net/hyperv/rndis_filter.c @@ -508,8 +508,6 @@ static int rndis_filter_receive_data(struct net_device *ndev, return ret; drop: - /* Drop incomplete packet */ - nvchan->rsc.cnt = 0; return NVSP_STAT_FAIL; } |