summaryrefslogtreecommitdiffstats
path: root/sys/netinet/tcp_syncache.c
diff options
context:
space:
mode:
authorhsu <hsu@FreeBSD.org>2002-06-10 20:05:46 +0000
committerhsu <hsu@FreeBSD.org>2002-06-10 20:05:46 +0000
commitcd25d4648fdd5f53f76f460b7f57015bdc89bb56 (patch)
treef0e255a19712887860d91eada0fa049d83035db7 /sys/netinet/tcp_syncache.c
parent920300b8349bd6c222b5aa8140a0446a150745ff (diff)
downloadFreeBSD-src-cd25d4648fdd5f53f76f460b7f57015bdc89bb56.zip
FreeBSD-src-cd25d4648fdd5f53f76f460b7f57015bdc89bb56.tar.gz
Lock up inpcb.
Submitted by: Jennifer Yang <yangjihui@yahoo.com>
Diffstat (limited to 'sys/netinet/tcp_syncache.c')
-rw-r--r--sys/netinet/tcp_syncache.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/sys/netinet/tcp_syncache.c b/sys/netinet/tcp_syncache.c
index 771fa82..30a3a93 100644
--- a/sys/netinet/tcp_syncache.c
+++ b/sys/netinet/tcp_syncache.c
@@ -367,24 +367,29 @@ syncache_timer(xslot)
callout_deactivate(&tcp_syncache.tt_timerq[slot]);
nsc = TAILQ_FIRST(&tcp_syncache.timerq[slot]);
+ INP_INFO_RLOCK(&tcbinfo);
while (nsc != NULL) {
if (ticks < nsc->sc_rxttime)
break;
sc = nsc;
nsc = TAILQ_NEXT(sc, sc_timerq);
inp = sc->sc_tp->t_inpcb;
+ INP_LOCK(inp);
if (slot == SYNCACHE_MAXREXMTS ||
slot >= tcp_syncache.rexmt_limit ||
inp->inp_gencnt != sc->sc_inp_gencnt) {
syncache_drop(sc, NULL);
tcpstat.tcps_sc_stale++;
+ INP_UNLOCK(inp);
continue;
}
(void) syncache_respond(sc, NULL);
+ INP_UNLOCK(inp);
tcpstat.tcps_sc_retransmitted++;
TAILQ_REMOVE(&tcp_syncache.timerq[slot], sc, sc_timerq);
SYNCACHE_TIMEOUT(sc, slot + 1);
}
+ INP_INFO_RUNLOCK(&tcbinfo);
if (nsc != NULL)
callout_reset(&tcp_syncache.tt_timerq[slot],
nsc->sc_rxttime - ticks, syncache_timer, (void *)(slot));
OpenPOWER on IntegriCloud