DragonFlyBSD Kernel Audit
DF-0636 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/netgraph7/tty/ng_tty.c b/sys/netgraph7/tty/ng_tty.c
--- a/sys/netgraph7/tty/ng_tty.c
+++ b/sys/netgraph7/tty/ng_tty.c
@@ -588,12 +588,14 @@ ngt_rcvdata(hook_p hook, struct item *item)

 	NGI_GET_M(item, m);
 	NG_FREE_ITEM(item);
-
+	lwkt_gettoken(&tp->t_token);	/* DF-0636: protect outq access */
 	if (IF_QFULL(&sc->outq)) {
 		IF_DROP(&sc->outq);
 		NG_FREE_M(m);
+		lwkt_reltoken(&tp->t_token);
 		return (ENOBUFS);
 	}

 	IF_ENQUEUE(&sc->outq, m);
 	qlen = sc->outq.ifq_len;
@@ -601,9 +603,6 @@ ngt_rcvdata(hook_p hook, struct item *item)
 	/*
 	 * If qlen > 1, then we should already have a scheduled callout.
 	 */
-	if (qlen == 1) {
-		lwkt_gettoken(&tp->t_token);
-		ngt_start(sc->tp);
-		lwkt_reltoken(&tp->t_token);
-	}
+	if (qlen == 1)
+		ngt_start(sc->tp);
+	lwkt_reltoken(&tp->t_token);

 	return (0);