View | Details | Raw Unified | Return to bug 195191 | Differences between
and this patch

Collapse All | Expand All

(-)usr.sbin/rtadvd/if.c (-16 / +36 lines)
Lines 404-409 update_ifinfo_nd_flags(struct ifinfo *ifi) Link Here
404
	return (0);
404
	return (0);
405
}
405
}
406
406
407
#define MAX_SYSCTL_TRY 5
407
struct ifinfo *
408
struct ifinfo *
408
update_ifinfo(struct ifilist_head_t *ifi_head, int ifindex)
409
update_ifinfo(struct ifilist_head_t *ifi_head, int ifindex)
409
{
410
{
Lines 416-441 update_ifinfo(struct ifilist_head_t *ifi_head, int Link Here
416
	char *lim;
417
	char *lim;
417
	int mib[] = { CTL_NET, PF_ROUTE, 0, AF_INET6, NET_RT_IFLIST, 0 };
418
	int mib[] = { CTL_NET, PF_ROUTE, 0, AF_INET6, NET_RT_IFLIST, 0 };
418
	int error;
419
	int error;
420
	int ntry = 0;
419
421
420
	syslog(LOG_DEBUG, "<%s> enter", __func__);
422
	syslog(LOG_DEBUG, "<%s> enter", __func__);
421
423
422
	if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), NULL, &len, NULL, 0) <
424
	do {
423
	    0) {
425
		/*
424
		syslog(LOG_ERR,
426
		 * We'll try to get addresses several times in case that
425
		    "<%s> sysctl: NET_RT_IFLIST size get failed", __func__);
427
		 * the number of addresses is unexpectedly increased during
426
		exit(1);
428
		 * the two sysctl calls.  This should rarely happen.
427
	}
429
		 * Portability note: since FreeBSD does not add margin of
428
	if ((msg = malloc(len)) == NULL) {
430
		 * memory at the first sysctl, the possibility of failure on
429
		syslog(LOG_ERR, "<%s> malloc failed", __func__);
431
		 * the second sysctl call is a bit higher.
430
		exit(1);
432
		 */
431
	}
432
	if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), msg, &len, NULL, 0) <
433
	    0) {
434
		syslog(LOG_ERR,
435
		    "<%s> sysctl: NET_RT_IFLIST get failed", __func__);
436
		exit(1);
437
	}
438
433
434
		if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), NULL, &len, NULL,
435
		    0) < 0) {
436
			syslog(LOG_ERR,
437
			    "<%s> sysctl: NET_RT_IFLIST size get failed",
438
			    __func__);
439
			exit(1);
440
		}
441
		if ((msg = malloc(len)) == NULL) {
442
			syslog(LOG_ERR, "<%s> malloc failed", __func__);
443
			exit(1);
444
		}
445
		if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), msg, &len, NULL,
446
		    0) < 0) {
447
			if (errno != ENOMEM || ++ntry >= MAX_SYSCTL_TRY) {
448
				free(msg);
449
				syslog(LOG_ERR,
450
				    "<%s> sysctl: NET_RT_IFLIST get failed",
451
				    __func__);
452
				exit(1);
453
			}
454
			free(msg);
455
			msg = NULL;
456
		}
457
	} while (msg == NULL);
458
439
	lim = msg + len;
459
	lim = msg + len;
440
	for (ifm = (struct if_msghdr *)msg;
460
	for (ifm = (struct if_msghdr *)msg;
441
	     ifm != NULL && ifm < (struct if_msghdr *)lim;
461
	     ifm != NULL && ifm < (struct if_msghdr *)lim;

Return to bug 195191