diff options
author | ume <ume@FreeBSD.org> | 2002-10-31 19:45:48 +0000 |
---|---|---|
committer | ume <ume@FreeBSD.org> | 2002-10-31 19:45:48 +0000 |
commit | e7761b68eeb8f5e6f3fa52cdb97e933040a25d0d (patch) | |
tree | dfe2a831b7d8cf482c9f37eddd1601458d291704 /sys | |
parent | 6fd59a8854bcc6fb96245e7db41d5a5fd33f74bf (diff) | |
download | FreeBSD-src-e7761b68eeb8f5e6f3fa52cdb97e933040a25d0d.zip FreeBSD-src-e7761b68eeb8f5e6f3fa52cdb97e933040a25d0d.tar.gz |
plugged memory leakage in some erroneous cases
Obtained from: KAME
MFC after: 1 week
Diffstat (limited to 'sys')
-rw-r--r-- | sys/netinet6/ip6_output.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/sys/netinet6/ip6_output.c b/sys/netinet6/ip6_output.c index a45727e..94be84a 100644 --- a/sys/netinet6/ip6_output.c +++ b/sys/netinet6/ip6_output.c @@ -1781,10 +1781,10 @@ ip6_pcbopts(pktopt, m, so, sopt) if (!m || m->m_len == 0) { /* - * Only turning off any previous options. + * Only turning off any previous options, regardless of + * whether the opt is just created or given. */ - if (opt) - free(opt, M_IP6OPT); + free(opt, M_IP6OPT); return(0); } @@ -1793,6 +1793,7 @@ ip6_pcbopts(pktopt, m, so, sopt) priv = 1; if ((error = ip6_setpktoptions(m, opt, priv, 1)) != 0) { ip6_clearpktopts(opt, 1, -1); /* XXX: discard all options */ + free(opt, M_IP6OPT); return(error); } *pktopt = opt; @@ -1884,7 +1885,7 @@ ip6_copypktopts(src, canwait) dst = malloc(sizeof(*dst), M_IP6OPT, canwait); if (dst == NULL && canwait == M_NOWAIT) - goto bad; + return (NULL); bzero(dst, sizeof(*dst)); dst->ip6po_hlim = src->ip6po_hlim; @@ -1910,13 +1911,13 @@ ip6_copypktopts(src, canwait) return(dst); bad: - printf("ip6_copypktopts: copy failed"); if (dst->ip6po_pktinfo) free(dst->ip6po_pktinfo, M_IP6OPT); if (dst->ip6po_nexthop) free(dst->ip6po_nexthop, M_IP6OPT); if (dst->ip6po_hbh) free(dst->ip6po_hbh, M_IP6OPT); if (dst->ip6po_dest1) free(dst->ip6po_dest1, M_IP6OPT); if (dst->ip6po_dest2) free(dst->ip6po_dest2, M_IP6OPT); if (dst->ip6po_rthdr) free(dst->ip6po_rthdr, M_IP6OPT); + free(dst, M_IP6OPT); return(NULL); } #undef PKTOPT_EXTHDRCPY |