Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

af-packet: Hold reference to bound network devices.

Old code was probably safe, but with this change we
can actually use the netdev object, not just compare
the pointer values.

Signed-off-by: Ben Greear <greearb@candelatech.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Ben Greear and committed by
David S. Miller
160ff18a e990b37b

+9 -5
+9 -5
net/packet/af_packet.c
··· 1342 1342 __dev_remove_pack(&po->prot_hook); 1343 1343 __sock_put(sk); 1344 1344 } 1345 + if (po->prot_hook.dev) { 1346 + dev_put(po->prot_hook.dev); 1347 + po->prot_hook.dev = NULL; 1348 + } 1345 1349 spin_unlock(&po->bind_lock); 1346 1350 1347 1351 packet_flush_mclist(sk); ··· 1399 1395 1400 1396 po->num = protocol; 1401 1397 po->prot_hook.type = protocol; 1398 + if (po->prot_hook.dev) 1399 + dev_put(po->prot_hook.dev); 1402 1400 po->prot_hook.dev = dev; 1403 1401 1404 1402 po->ifindex = dev ? dev->ifindex : 0; ··· 1445 1439 strlcpy(name, uaddr->sa_data, sizeof(name)); 1446 1440 1447 1441 dev = dev_get_by_name(sock_net(sk), name); 1448 - if (dev) { 1442 + if (dev) 1449 1443 err = packet_do_bind(sk, dev, pkt_sk(sk)->num); 1450 - dev_put(dev); 1451 - } 1452 1444 return err; 1453 1445 } 1454 1446 ··· 1474 1470 goto out; 1475 1471 } 1476 1472 err = packet_do_bind(sk, dev, sll->sll_protocol ? : pkt_sk(sk)->num); 1477 - if (dev) 1478 - dev_put(dev); 1479 1473 1480 1474 out: 1481 1475 return err; ··· 2242 2240 } 2243 2241 if (msg == NETDEV_UNREGISTER) { 2244 2242 po->ifindex = -1; 2243 + if (po->prot_hook.dev) 2244 + dev_put(po->prot_hook.dev); 2245 2245 po->prot_hook.dev = NULL; 2246 2246 } 2247 2247 spin_unlock(&po->bind_lock);