Hi,

>From NetBSD:

http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/netinet6/udp6_output.c?rev=1.41&content-type=text/x-cvsweb-markup&only_with_tag=MAIN
"
Under some circumstances, udp6_output() would call ip6_clearpktopts()
with an uninitialized struct ip6_pktopts on the stack, opt.
ip6_clearpktopts(&opt, ...) could dereference dangling pointers,
leading to memory corruption or a crash.  Now, udp6_output() calls
ip6_clearpktopts(&opt, ...) only if opt was initialized. Thanks to
Clement LECIGNE for reporting this bug."

I checked openbsd source code and it seems that the issue is present
as well.

Tentative diff:

Index: udp6_output.c
===================================================================
RCS file: /cvs/src/sys/netinet6/udp6_output.c,v
retrieving revision 1.19
diff -u -p -r1.19 udp6_output.c
--- udp6_output.c       28 Mar 2013 16:45:16 -0000      1.19
+++ udp6_output.c       23 Aug 2013 19:30:36 -0000
@@ -119,7 +119,8 @@ udp6_output(struct in6pcb *in6p, struct 
        struct  in6_addr *laddr, *faddr;
        u_short fport;
        int error = 0;
-       struct ip6_pktopts *optp, opt;
+       struct ip6_pktopts *optp = NULL; 
+       struct ip6_pktopts opt;
        int priv;
        int af, hlen;
        int flags;
@@ -284,7 +285,8 @@ release:
 
 releaseopt:
        if (control) {
-               ip6_clearpktopts(&opt, -1);
+               if (optp == &opt)
+                       ip6_clearpktopts(&opt, -1);
                m_freem(control);
        }
        return (error);

Reply via email to