diff options
Diffstat (limited to 'drivers/net/tun.c')
-rw-r--r-- | drivers/net/tun.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 8a7d6b905362..30863e378925 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
@@ -1207,9 +1207,11 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, | |||
1207 | } | 1207 | } |
1208 | 1208 | ||
1209 | if (tun->flags & IFF_VNET_HDR) { | 1209 | if (tun->flags & IFF_VNET_HDR) { |
1210 | if (len < tun->vnet_hdr_sz) | 1210 | int vnet_hdr_sz = READ_ONCE(tun->vnet_hdr_sz); |
1211 | |||
1212 | if (len < vnet_hdr_sz) | ||
1211 | return -EINVAL; | 1213 | return -EINVAL; |
1212 | len -= tun->vnet_hdr_sz; | 1214 | len -= vnet_hdr_sz; |
1213 | 1215 | ||
1214 | if (!copy_from_iter_full(&gso, sizeof(gso), from)) | 1216 | if (!copy_from_iter_full(&gso, sizeof(gso), from)) |
1215 | return -EFAULT; | 1217 | return -EFAULT; |
@@ -1220,7 +1222,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, | |||
1220 | 1222 | ||
1221 | if (tun16_to_cpu(tun, gso.hdr_len) > len) | 1223 | if (tun16_to_cpu(tun, gso.hdr_len) > len) |
1222 | return -EINVAL; | 1224 | return -EINVAL; |
1223 | iov_iter_advance(from, tun->vnet_hdr_sz - sizeof(gso)); | 1225 | iov_iter_advance(from, vnet_hdr_sz - sizeof(gso)); |
1224 | } | 1226 | } |
1225 | 1227 | ||
1226 | if ((tun->flags & TUN_TYPE_MASK) == IFF_TAP) { | 1228 | if ((tun->flags & TUN_TYPE_MASK) == IFF_TAP) { |
@@ -1371,7 +1373,7 @@ static ssize_t tun_put_user(struct tun_struct *tun, | |||
1371 | vlan_hlen = VLAN_HLEN; | 1373 | vlan_hlen = VLAN_HLEN; |
1372 | 1374 | ||
1373 | if (tun->flags & IFF_VNET_HDR) | 1375 | if (tun->flags & IFF_VNET_HDR) |
1374 | vnet_hdr_sz = tun->vnet_hdr_sz; | 1376 | vnet_hdr_sz = READ_ONCE(tun->vnet_hdr_sz); |
1375 | 1377 | ||
1376 | total = skb->len + vlan_hlen + vnet_hdr_sz; | 1378 | total = skb->len + vlan_hlen + vnet_hdr_sz; |
1377 | 1379 | ||