Module Name:    src
Committed By:   riastradh
Date:           Mon Aug 18 04:28:55 UTC 2014

Modified Files:
        src/sys/net: if_gre.c

Log Message:
Don't leak in gre_clone_create error branch.

Noted by maxv@, compile-tested for amd64.


To generate a diff of this commit:
cvs rdiff -u -r1.159 -r1.160 src/sys/net/if_gre.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_gre.c
diff -u src/sys/net/if_gre.c:1.159 src/sys/net/if_gre.c:1.160
--- src/sys/net/if_gre.c:1.159	Fri Aug  8 03:05:45 2014
+++ src/sys/net/if_gre.c	Mon Aug 18 04:28:55 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_gre.c,v 1.159 2014/08/08 03:05:45 rtr Exp $ */
+/*	$NetBSD: if_gre.c,v 1.160 2014/08/18 04:28:55 riastradh Exp $ */
 
 /*
  * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc.
@@ -45,7 +45,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.159 2014/08/08 03:05:45 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.160 2014/08/18 04:28:55 riastradh Exp $");
 
 #include "opt_atalk.h"
 #include "opt_gre.h"
@@ -275,7 +275,7 @@ gre_clone_create(struct if_clone *ifc, i
 
 	if ((any = sockaddr_any_by_family(AF_INET)) == NULL &&
 	    (any = sockaddr_any_by_family(AF_INET6)) == NULL)
-		return -1;
+		goto fail0;
 
 	sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_ZERO);
 	mutex_init(&sc->sc_mtx, MUTEX_DRIVER, IPL_SOFTNET);
@@ -302,9 +302,8 @@ gre_clone_create(struct if_clone *ifc, i
 
 	rc = kthread_create(PRI_NONE, KTHREAD_MPSAFE, NULL, gre_fp_recvloop, sc,
 	    NULL, "%s", sc->sc_if.if_xname);
-
-	if (rc != 0)
-		return -1;
+	if (rc)
+		goto fail1;
 
 	gre_evcnt_attach(sc);
 
@@ -314,6 +313,12 @@ gre_clone_create(struct if_clone *ifc, i
 	if_alloc_sadl(&sc->sc_if);
 	bpf_attach(&sc->sc_if, DLT_NULL, sizeof(uint32_t));
 	return 0;
+
+fail1:	cv_destroy(&sc->sc_fp_condvar);
+	cv_destroy(&sc->sc_condvar);
+	mutex_destroy(&sc->sc_mtx);
+	free(sc, M_DEVBUF);
+fail0:	return -1;
 }
 
 static int

Reply via email to