Module Name:    src
Committed By:   christos
Date:           Thu Apr 30 16:01:52 UTC 2015

Modified Files:
        src/sys/dev/bluetooth: bcsp.c

Log Message:
Fix more memory leaks by changing the transmit routines to always free the
mbuf to send.


To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/sys/dev/bluetooth/bcsp.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/dev/bluetooth/bcsp.c
diff -u src/sys/dev/bluetooth/bcsp.c:1.26 src/sys/dev/bluetooth/bcsp.c:1.27
--- src/sys/dev/bluetooth/bcsp.c:1.26	Mon Apr 27 13:36:41 2015
+++ src/sys/dev/bluetooth/bcsp.c	Thu Apr 30 12:01:51 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: bcsp.c,v 1.26 2015/04/27 17:36:41 christos Exp $	*/
+/*	$NetBSD: bcsp.c,v 1.27 2015/04/30 16:01:51 christos Exp $	*/
 /*
  * Copyright (c) 2007 KIYOHARA Takashi
  * All rights reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bcsp.c,v 1.26 2015/04/27 17:36:41 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bcsp.c,v 1.27 2015/04/30 16:01:51 christos Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -1132,12 +1132,12 @@ bcsp_tx_reliable_pkt(struct bcsp_softc *
 		pldlen += _m->m_len;
 	}
 	if (pldlen > 0xfff)
-		return false;
+		goto out;
 	if (protocol_id == BCSP_IDENT_ACKPKT || protocol_id > 15)
-		return false;
+		goto out;
 
 	if (sc->sc_seq_winspace == 0)
-		return false;
+		goto out;
 
 	M_PREPEND(m, sizeof(bcsp_hdr_t), M_DONTWAIT);
 	if (m == NULL) {
@@ -1168,12 +1168,15 @@ bcsp_tx_reliable_pkt(struct bcsp_softc *
 	_m = m_copym(m, 0, M_COPYALL, M_DONTWAIT);
 	if (_m == NULL) {
 		aprint_error_dev(sc->sc_dev, "out of memory\n");
-		return false;
+		goto out;
 	}
 	MBUFQ_ENQUEUE(&sc->sc_seq_retryq, _m);
 	bcsp_mux_transmit(sc);
 
 	return true;
+out:
+	m_freem(m);
+	return false;
 }
 
 #if 0
@@ -1369,9 +1372,9 @@ bcsp_tx_unreliable_pkt(struct bcsp_softc
 	}
 	DPRINTFN(1, (" pldlen=%d\n", pldlen));
 	if (pldlen > 0xfff)
-		return false;
+		goto out;
 	if (protocol_id == BCSP_IDENT_ACKPKT || protocol_id > 15)
-		return false;
+		goto out;
 
 	M_PREPEND(m, sizeof(bcsp_hdr_t), M_DONTWAIT);
 	if (m == NULL) {
@@ -1397,6 +1400,9 @@ bcsp_tx_unreliable_pkt(struct bcsp_softc
 	bcsp_mux_transmit(sc);
 
 	return true;
+out:
+	m_freem(m);
+	return false;
 }
 
 #if 0
@@ -1442,7 +1448,6 @@ bcsp_start_le(struct bcsp_softc *sc)
 		m->m_pkthdr.len = m->m_len = 0;
 		m_copyback(m, 0, sizeof(sync), sync);
 		if (!bcsp_tx_unreliable_pkt(sc, m, BCSP_CHANNEL_LE)) {
-			m_freem(m);
 			aprint_error_dev(sc->sc_dev,
 			    "le-packet transmit failed\n");
 			return EINVAL;

Reply via email to