Index: sys/netinet6/ip6_output.c =================================================================== --- sys/netinet6/ip6_output.c +++ sys/netinet6/ip6_output.c @@ -2303,8 +2303,9 @@ #define GET_PKTOPT_VAR(field, lenexpr) do { \ if (pktopt && pktopt->field) { \ + optdatalen = ulmin(lenexpr, sopt->sopt_valsize); \ INP_RUNLOCK(in6p); \ - optdata = malloc(sopt->sopt_valsize, M_TEMP, M_WAITOK); \ + optdata = malloc(optdatalen, M_TEMP, M_WAITOK); \ malloc_optdata = true; \ INP_RLOCK(in6p); \ if (in6p->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) { \ @@ -2313,14 +2314,11 @@ return (ECONNRESET); \ } \ pktopt = in6p->in6p_outputopts; \ - if (pktopt && pktopt->field) { \ - optdatalen = min(lenexpr, sopt->sopt_valsize); \ - bcopy(&pktopt->field, optdata, optdatalen); \ - } else { \ - free(optdata, M_TEMP); \ - optdata = NULL; \ - malloc_optdata = false; \ - } \ + bcopy(&pktopt->field, optdata, optdatalen); \ + } else { \ + free(optdata, M_TEMP); \ + optdata = NULL; \ + malloc_optdata = false; \ } \ } while(0)