aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/tun.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/tun.c')
-rw-r--r--drivers/net/tun.c10
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