Skip to content

Commit 152669b

Browse files
dcuidavem330
authored andcommitted
netvsc: fix use-after-free in netvsc_change_mtu()
'nvdev' is freed in rndis_filter_device_remove -> netvsc_device_remove -> free_netvsc_device, so we mustn't access it, before it's re-created in rndis_filter_device_add -> netvsc_device_add. Signed-off-by: Dexuan Cui <[email protected]> Cc: "K. Y. Srinivasan" <[email protected]> Cc: Haiyang Zhang <[email protected]> Cc: Stephen Hemminger <[email protected]> Reviewed-by: Stephen Hemminger <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 35576ee commit 152669b

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

drivers/net/hyperv/netvsc_drv.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -859,15 +859,22 @@ static int netvsc_change_mtu(struct net_device *ndev, int mtu)
859859
if (ret)
860860
goto out;
861861

862+
memset(&device_info, 0, sizeof(device_info));
863+
device_info.ring_size = ring_size;
864+
device_info.num_chn = nvdev->num_chn;
865+
device_info.max_num_vrss_chns = nvdev->num_chn;
866+
862867
ndevctx->start_remove = true;
863868
rndis_filter_device_remove(hdev, nvdev);
864869

870+
/* 'nvdev' has been freed in rndis_filter_device_remove() ->
871+
* netvsc_device_remove () -> free_netvsc_device().
872+
* We mustn't access it before it's re-created in
873+
* rndis_filter_device_add() -> netvsc_device_add().
874+
*/
875+
865876
ndev->mtu = mtu;
866877

867-
memset(&device_info, 0, sizeof(device_info));
868-
device_info.ring_size = ring_size;
869-
device_info.num_chn = nvdev->num_chn;
870-
device_info.max_num_vrss_chns = nvdev->num_chn;
871878
rndis_filter_device_add(hdev, &device_info);
872879

873880
out:

0 commit comments

Comments
 (0)