Index: parse.y =================================================================== RCS file: /cvs/src/sbin/pfctl/parse.y,v retrieving revision 1.643 diff -u -p -r1.643 parse.y --- parse.y 19 Dec 2014 13:04:07 -0000 1.643 +++ parse.y 24 Dec 2014 06:43:12 -0000 @@ -4150,10 +4150,10 @@ expand_label_addr(const char *name, char PF_AZERO(&h->addr.v.a.mask, af))) snprintf(tmp, sizeof(tmp), "any"); else { - char a[48]; + char a[NI_MAXHOST]; int bits; - if (inet_ntop(af, &h->addr.v.a.addr, a, + if (pf_ntop(af, &h->addr.v.a.addr, a, sizeof(a)) == NULL) snprintf(tmp, sizeof(tmp), "?"); else { Index: pf_print_state.c =================================================================== RCS file: /cvs/src/sbin/pfctl/pf_print_state.c,v retrieving revision 1.63 diff -u -p -r1.63 pf_print_state.c --- pf_print_state.c 17 Aug 2012 20:37:16 -0000 1.63 +++ pf_print_state.c 24 Dec 2014 06:43:12 -0000 @@ -50,6 +50,8 @@ void print_name(struct pf_addr *, sa_fam void print_addr(struct pf_addr_wrap *addr, sa_family_t af, int verbose) { + char buf[NI_MAXHOST]; + switch (addr->type) { case PF_ADDR_DYNIFTL: printf("(%s", addr->v.ifname); @@ -79,32 +81,28 @@ print_addr(struct pf_addr_wrap *addr, sa else printf("<%s>", addr->v.tblname); return; - case PF_ADDR_RANGE: { - char buf[48]; - - if (inet_ntop(af, &addr->v.a.addr, buf, sizeof(buf)) == NULL) + case PF_ADDR_RANGE: + if (pf_ntop(af, &addr->v.a.addr, buf, sizeof(buf)) == NULL) printf("?"); else printf("%s", buf); - if (inet_ntop(af, &addr->v.a.mask, buf, sizeof(buf)) == NULL) + + if (pf_ntop(af, &addr->v.a.mask, buf, sizeof(buf)) == NULL) printf(" - ?"); else printf(" - %s", buf); break; - } case PF_ADDR_ADDRMASK: if (PF_AZERO(&addr->v.a.addr, AF_INET6) && - PF_AZERO(&addr->v.a.mask, AF_INET6)) + PF_AZERO(&addr->v.a.mask, AF_INET6)) { printf("any"); - else { - char buf[48]; - - if (inet_ntop(af, &addr->v.a.addr, buf, - sizeof(buf)) == NULL) - printf("?"); - else - printf("%s", buf); + break; } + + if (pf_ntop(af, &addr->v.a.addr, buf, sizeof(buf)) == NULL) + printf("?"); + else + printf("%s", buf); break; case PF_ADDR_NOROUTE: printf("no-route"); @@ -129,6 +127,41 @@ print_addr(struct pf_addr_wrap *addr, sa if (bits < (af == AF_INET ? 32 : 128)) printf("/%d", bits); } +} + +const char * +pf_ntop(sa_family_t af, struct pf_addr *addr, char *buf, size_t buflen) +{ + struct sockaddr_storage ss; + struct sockaddr_in *sin = (struct sockaddr_in *)&ss; + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&ss; + + memset(&ss, 0, sizeof(ss)); + + switch (af) { + case AF_INET: + sin->sin_len = sizeof(*sin); + sin->sin_family = AF_INET; + sin->sin_addr = addr->v4; + break; + case AF_INET6: + sin6->sin6_len = sizeof(*sin6); + sin6->sin6_family = AF_INET6; + sin6->sin6_addr = addr->v6; + +#ifdef __KAME__ + if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) { + sin6->sin6_scope_id = + ntohs(*(u_int16_t *)&sin6->sin6_addr.s6_addr[2]); + sin6->sin6_addr.s6_addr[2] = 0; + sin6->sin6_addr.s6_addr[3] = 0; + } +#endif /* __KAME__ */ + break; + } + + return (getnameinfo((struct sockaddr *)&ss, ss.ss_len, + buf, buflen, NULL, 0, NI_NUMERICHOST) == 0 ? buf : NULL); } void Index: pfctl.h =================================================================== RCS file: /cvs/src/sbin/pfctl/pfctl.h,v retrieving revision 1.52 diff -u -p -r1.52 pfctl.h --- pfctl.h 19 Apr 2014 14:22:32 -0000 1.52 +++ pfctl.h 24 Dec 2014 06:43:12 -0000 @@ -104,6 +104,7 @@ void print_host(struct pf_addr *, u_int void print_seq(struct pfsync_state_peer *); void print_state(struct pfsync_state *, int); int unmask(struct pf_addr *, sa_family_t); +const char *pf_ntop(sa_family_t, struct pf_addr *, char *, size_t); int pfctl_cmdline_symset(char *); int pfctl_add_trans(struct pfr_buffer *, int, const char *); Index: pfctl_optimize.c =================================================================== RCS file: /cvs/src/sbin/pfctl/pfctl_optimize.c,v retrieving revision 1.34 diff -u -p -r1.34 pfctl_optimize.c --- pfctl_optimize.c 13 Sep 2014 16:06:36 -0000 1.34 +++ pfctl_optimize.c 24 Dec 2014 06:43:12 -0000 @@ -1209,7 +1209,7 @@ add_opt_table(struct pfctl *pf, struct p struct pf_rule_addr *addr, char *ifname) { #ifdef OPT_DEBUG - char buf[128]; + char buf[NI_HOSTMAX]; #endif /* OPT_DEBUG */ static int tablenum = 0; struct node_host node_host; @@ -1235,7 +1235,7 @@ add_opt_table(struct pfctl *pf, struct p node_host.weight = addr->weight; #ifdef OPT_DEBUG - DEBUG("<%s> adding %s/%d", (*tbl)->pt_name, inet_ntop(af, + DEBUG("<%s> adding %s/%d", (*tbl)->pt_name, pf_ntop(af, &node_host.addr.v.a.addr, buf, sizeof(buf)), unmask(&node_host.addr.v.a.mask, af)); #endif /* OPT_DEBUG */ Index: pfctl_parser.c =================================================================== RCS file: /cvs/src/sbin/pfctl/pfctl_parser.c,v retrieving revision 1.300 diff -u -p -r1.300 pfctl_parser.c --- pfctl_parser.c 27 Oct 2014 21:51:32 -0000 1.300 +++ pfctl_parser.c 24 Dec 2014 06:43:12 -0000 @@ -1061,11 +1061,10 @@ print_rule(struct pf_rule *r, const char if (PF_AZERO(&r->divert.addr, AF_INET6)) { printf(" divert-reply"); } else { - /* XXX cut&paste from print_addr */ - char buf[48]; + char buf[NI_MAXHOST]; printf(" divert-to "); - if (inet_ntop(r->af, &r->divert.addr, buf, + if (pf_ntop(r->af, &r->divert.addr, buf, sizeof(buf)) == NULL) printf("?"); else Index: pfctl_table.c =================================================================== RCS file: /cvs/src/sbin/pfctl/pfctl_table.c,v retrieving revision 1.72 diff -u -p -r1.72 pfctl_table.c --- pfctl_table.c 5 Jul 2013 13:07:57 -0000 1.72 +++ pfctl_table.c 24 Dec 2014 06:43:12 -0000 @@ -432,21 +432,21 @@ load_addr(struct pfr_buffer *b, int argc void print_addrx(struct pfr_addr *ad, struct pfr_addr *rad, int dns) { - char ch, buf[256] = "{error}"; + char ch, buf[NI_MAXHOST] = "{error}"; char fb[] = { ' ', 'M', 'A', 'D', 'C', 'Z', 'X', ' ', 'Y', ' ' }; unsigned int fback, hostnet; fback = (rad != NULL) ? rad->pfra_fback : ad->pfra_fback; ch = (fback < sizeof(fb)/sizeof(*fb)) ? fb[fback] : '?'; hostnet = (ad->pfra_af == AF_INET6) ? 128 : 32; - inet_ntop(ad->pfra_af, &ad->pfra_u, buf, sizeof(buf)); + pf_ntop(ad->pfra_af, &ad->pfra_u, buf, sizeof(buf)); printf("%c %c%s", ch, (ad->pfra_not?'!':' '), buf); if (ad->pfra_net < hostnet) printf("/%d", ad->pfra_net); if (rad != NULL && fback != PFR_FB_NONE) { if (strlcpy(buf, "{error}", sizeof(buf)) >= sizeof(buf)) errx(1, "print_addrx: strlcpy"); - inet_ntop(rad->pfra_af, &rad->pfra_u, buf, sizeof(buf)); + pf_ntop(rad->pfra_af, &rad->pfra_u, buf, sizeof(buf)); printf("\t%c%s", (rad->pfra_not?'!':' '), buf); if (rad->pfra_net < hostnet) printf("/%d", rad->pfra_net);