diff --git a/sys/netpfil/ipfilter/netinet/fil.c b/sys/netpfil/ipfilter/netinet/fil.c --- a/sys/netpfil/ipfilter/netinet/fil.c +++ b/sys/netpfil/ipfilter/netinet/fil.c @@ -9951,3 +9951,37 @@ ASSERT(mtab->imt6_max >= 0); } #endif + +/* ------------------------------------------------------------------------ */ +/* Function: ipf_frname_vfy */ +/* Returns: char * - 0 == FRNAME */ +/* - NULL == */ +/* fr_ifnames index is < 0 */ +/* fr_name exceeds MAX_IFNAME_LENGTH */ +/* fr_name string exceeds fr_namelen */ +/* Parameters: fr(I) - pointer to filter rule */ +/* i - index */ +/* */ +/* Bounds-check all indices into fr_names. Return a verified FRNAME. */ +/* ------------------------------------------------------------------------ */ +char * +ipf_frname_vfy(frentry_t *fr, int i) +{ + size_t namelen; + char *name; + + /* + * We assume the caller has already ensured fr_namelen is acceptable: + * if (fr->fr_namelen > MAX_IFNAME_LENGTH)) + * then error + */ + + if (fr->fr_ifnames[i] < 0) + return (NULL); + name = FR_NAME(fr, fr_ifnames[i]); + if ((namelen = strnlen(name ,LIFNAMSIZ + 1)) > LIFNAMSIZ) + return (NULL); + if (namelen > fr->fr_namelen) + return (NULL); + return (name); +} diff --git a/sys/netpfil/ipfilter/netinet/ip_fil.h b/sys/netpfil/ipfilter/netinet/ip_fil.h --- a/sys/netpfil/ipfilter/netinet/ip_fil.h +++ b/sys/netpfil/ipfilter/netinet/ip_fil.h @@ -1693,6 +1693,7 @@ extern int ipf_matcharray_load(ipf_main_softc_t *, caddr_t, ipfobj_t *, int **); extern int ipf_matcharray_verify(int *, int); +extern char *ipf_frname_vfy(frentry_t *, int); extern int ipf_outobj(ipf_main_softc_t *, void *, void *, int); extern int ipf_outobjk(ipf_main_softc_t *, ipfobj_t *, void *); extern int ipf_outobjsz(ipf_main_softc_t *, void *, void *,