Module Name: src Committed By: snj Date: Wed Aug 9 05:51:50 UTC 2017
Modified Files: src/sys/net [netbsd-8]: if_gif.c Log Message: Pull up following revision(s) (requested by knakahara in ticket #201): sys/net/if_gif.c: revision 1.128 fix leak when encap_attach() fails twice. To generate a diff of this commit: cvs rdiff -u -r1.126.2.1 -r1.126.2.2 src/sys/net/if_gif.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net/if_gif.c diff -u src/sys/net/if_gif.c:1.126.2.1 src/sys/net/if_gif.c:1.126.2.2 --- src/sys/net/if_gif.c:1.126.2.1 Fri Jun 30 06:17:51 2017 +++ src/sys/net/if_gif.c Wed Aug 9 05:51:50 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: if_gif.c,v 1.126.2.1 2017/06/30 06:17:51 snj Exp $ */ +/* $NetBSD: if_gif.c,v 1.126.2.2 2017/08/09 05:51:50 snj Exp $ */ /* $KAME: if_gif.c,v 1.76 2001/08/20 02:01:02 kjc Exp $ */ /* @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_gif.c,v 1.126.2.1 2017/06/30 06:17:51 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_gif.c,v 1.126.2.2 2017/08/09 05:51:50 snj Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -997,31 +997,34 @@ gif_set_tunnel(struct ifnet *ifp, struct /* * Secondly, try to set new configurations. - * If the setup failed, rollback to old configurations. */ - do { - osrc = sc->gif_psrc; - odst = sc->gif_pdst; - sc->gif_psrc = nsrc; - sc->gif_pdst = ndst; - + osrc = sc->gif_psrc; + odst = sc->gif_pdst; + sc->gif_psrc = nsrc; + sc->gif_pdst = ndst; + error = gif_encap_attach(sc); + if (error && osrc != NULL && odst != NULL) { + /* + * Thirdly, when error occured, rollback to old configurations, + * if last setting is valid. + */ + sc->gif_psrc = osrc; + sc->gif_pdst = odst; + osrc = nsrc; /* to free */ + odst = ndst; /* to free */ error = gif_encap_attach(sc); - if (error) { - /* rollback to the last configuration. */ - nsrc = osrc; - ndst = odst; - osrc = sc->gif_psrc; - odst = sc->gif_pdst; - - continue; - } - } while (error != 0 && (nsrc != NULL && ndst != NULL)); - /* Thirdly, even rollback failed, clear configurations. */ + } if (error) { - osrc = sc->gif_psrc; - odst = sc->gif_pdst; + /* + * Fourthly, even rollback failed or last setting is not valid, + * clear configurations. + */ + osrc = sc->gif_psrc; /* to free */ + odst = sc->gif_pdst; /* to free */ sc->gif_psrc = NULL; sc->gif_pdst = NULL; + sockaddr_free(nsrc); + sockaddr_free(ndst); } if (osrc)