aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv6/addrconf.c141
1 files changed, 69 insertions, 72 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index eb82cd5df8c6..01c62a0d3742 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -341,84 +341,83 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
341 if (dev->mtu < IPV6_MIN_MTU) 341 if (dev->mtu < IPV6_MIN_MTU)
342 return NULL; 342 return NULL;
343 343
344 ndev = kmalloc(sizeof(struct inet6_dev), GFP_KERNEL); 344 ndev = kzalloc(sizeof(struct inet6_dev), GFP_KERNEL);
345 345
346 if (ndev) { 346 if (ndev == NULL)
347 memset(ndev, 0, sizeof(struct inet6_dev)); 347 return NULL;
348 348
349 rwlock_init(&ndev->lock); 349 rwlock_init(&ndev->lock);
350 ndev->dev = dev; 350 ndev->dev = dev;
351 memcpy(&ndev->cnf, &ipv6_devconf_dflt, sizeof(ndev->cnf)); 351 memcpy(&ndev->cnf, &ipv6_devconf_dflt, sizeof(ndev->cnf));
352 ndev->cnf.mtu6 = dev->mtu; 352 ndev->cnf.mtu6 = dev->mtu;
353 ndev->cnf.sysctl = NULL; 353 ndev->cnf.sysctl = NULL;
354 ndev->nd_parms = neigh_parms_alloc(dev, &nd_tbl); 354 ndev->nd_parms = neigh_parms_alloc(dev, &nd_tbl);
355 if (ndev->nd_parms == NULL) { 355 if (ndev->nd_parms == NULL) {
356 kfree(ndev); 356 kfree(ndev);
357 return NULL; 357 return NULL;
358 } 358 }
359 /* We refer to the device */ 359 /* We refer to the device */
360 dev_hold(dev); 360 dev_hold(dev);
361
362 if (snmp6_alloc_dev(ndev) < 0) {
363 ADBG((KERN_WARNING
364 "%s(): cannot allocate memory for statistics; dev=%s.\n",
365 __FUNCTION__, dev->name));
366 neigh_parms_release(&nd_tbl, ndev->nd_parms);
367 ndev->dead = 1;
368 in6_dev_finish_destroy(ndev);
369 return NULL;
370 }
371 361
372 if (snmp6_register_dev(ndev) < 0) { 362 if (snmp6_alloc_dev(ndev) < 0) {
373 ADBG((KERN_WARNING 363 ADBG((KERN_WARNING
374 "%s(): cannot create /proc/net/dev_snmp6/%s\n", 364 "%s(): cannot allocate memory for statistics; dev=%s.\n",
375 __FUNCTION__, dev->name)); 365 __FUNCTION__, dev->name));
376 neigh_parms_release(&nd_tbl, ndev->nd_parms); 366 neigh_parms_release(&nd_tbl, ndev->nd_parms);
377 ndev->dead = 1; 367 ndev->dead = 1;
378 in6_dev_finish_destroy(ndev); 368 in6_dev_finish_destroy(ndev);
379 return NULL; 369 return NULL;
380 } 370 }
381 371
382 /* One reference from device. We must do this before 372 if (snmp6_register_dev(ndev) < 0) {
383 * we invoke __ipv6_regen_rndid(). 373 ADBG((KERN_WARNING
384 */ 374 "%s(): cannot create /proc/net/dev_snmp6/%s\n",
385 in6_dev_hold(ndev); 375 __FUNCTION__, dev->name));
376 neigh_parms_release(&nd_tbl, ndev->nd_parms);
377 ndev->dead = 1;
378 in6_dev_finish_destroy(ndev);
379 return NULL;
380 }
381
382 /* One reference from device. We must do this before
383 * we invoke __ipv6_regen_rndid().
384 */
385 in6_dev_hold(ndev);
386 386
387#ifdef CONFIG_IPV6_PRIVACY 387#ifdef CONFIG_IPV6_PRIVACY
388 init_timer(&ndev->regen_timer); 388 init_timer(&ndev->regen_timer);
389 ndev->regen_timer.function = ipv6_regen_rndid; 389 ndev->regen_timer.function = ipv6_regen_rndid;
390 ndev->regen_timer.data = (unsigned long) ndev; 390 ndev->regen_timer.data = (unsigned long) ndev;
391 if ((dev->flags&IFF_LOOPBACK) || 391 if ((dev->flags&IFF_LOOPBACK) ||
392 dev->type == ARPHRD_TUNNEL || 392 dev->type == ARPHRD_TUNNEL ||
393 dev->type == ARPHRD_NONE || 393 dev->type == ARPHRD_NONE ||
394 dev->type == ARPHRD_SIT) { 394 dev->type == ARPHRD_SIT) {
395 printk(KERN_INFO 395 printk(KERN_INFO
396 "%s: Disabled Privacy Extensions\n", 396 "%s: Disabled Privacy Extensions\n",
397 dev->name); 397 dev->name);
398 ndev->cnf.use_tempaddr = -1; 398 ndev->cnf.use_tempaddr = -1;
399 } else { 399 } else {
400 in6_dev_hold(ndev); 400 in6_dev_hold(ndev);
401 ipv6_regen_rndid((unsigned long) ndev); 401 ipv6_regen_rndid((unsigned long) ndev);
402 } 402 }
403#endif 403#endif
404 404
405 if (netif_carrier_ok(dev)) 405 if (netif_carrier_ok(dev))
406 ndev->if_flags |= IF_READY; 406 ndev->if_flags |= IF_READY;
407 407
408 write_lock_bh(&addrconf_lock); 408 write_lock_bh(&addrconf_lock);
409 dev->ip6_ptr = ndev; 409 dev->ip6_ptr = ndev;
410 write_unlock_bh(&addrconf_lock); 410 write_unlock_bh(&addrconf_lock);
411 411
412 ipv6_mc_init_dev(ndev); 412 ipv6_mc_init_dev(ndev);
413 ndev->tstamp = jiffies; 413 ndev->tstamp = jiffies;
414#ifdef CONFIG_SYSCTL 414#ifdef CONFIG_SYSCTL
415 neigh_sysctl_register(dev, ndev->nd_parms, NET_IPV6, 415 neigh_sysctl_register(dev, ndev->nd_parms, NET_IPV6,
416 NET_IPV6_NEIGH, "ipv6", 416 NET_IPV6_NEIGH, "ipv6",
417 &ndisc_ifinfo_sysctl_change, 417 &ndisc_ifinfo_sysctl_change,
418 NULL); 418 NULL);
419 addrconf_sysctl_register(ndev, &ndev->cnf); 419 addrconf_sysctl_register(ndev, &ndev->cnf);
420#endif 420#endif
421 }
422 return ndev; 421 return ndev;
423} 422}
424 423
@@ -536,7 +535,7 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen,
536 goto out; 535 goto out;
537 } 536 }
538 537
539 ifa = kmalloc(sizeof(struct inet6_ifaddr), GFP_ATOMIC); 538 ifa = kzalloc(sizeof(struct inet6_ifaddr), GFP_ATOMIC);
540 539
541 if (ifa == NULL) { 540 if (ifa == NULL) {
542 ADBG(("ipv6_add_addr: malloc failed\n")); 541 ADBG(("ipv6_add_addr: malloc failed\n"));
@@ -550,7 +549,6 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen,
550 goto out; 549 goto out;
551 } 550 }
552 551
553 memset(ifa, 0, sizeof(struct inet6_ifaddr));
554 ipv6_addr_copy(&ifa->addr, addr); 552 ipv6_addr_copy(&ifa->addr, addr);
555 553
556 spin_lock_init(&ifa->lock); 554 spin_lock_init(&ifa->lock);
@@ -2669,11 +2667,10 @@ static int if6_seq_open(struct inode *inode, struct file *file)
2669{ 2667{
2670 struct seq_file *seq; 2668 struct seq_file *seq;
2671 int rc = -ENOMEM; 2669 int rc = -ENOMEM;
2672 struct if6_iter_state *s = kmalloc(sizeof(*s), GFP_KERNEL); 2670 struct if6_iter_state *s = kzalloc(sizeof(*s), GFP_KERNEL);
2673 2671
2674 if (!s) 2672 if (!s)
2675 goto out; 2673 goto out;
2676 memset(s, 0, sizeof(*s));
2677 2674
2678 rc = seq_open(file, &if6_seq_ops); 2675 rc = seq_open(file, &if6_seq_ops);
2679 if (rc) 2676 if (rc)