diff options
-rw-r--r-- | net/ipv6/addrconf.c | 141 |
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) |