Date: Mon, 29 Mar 2004 23:20:58 +0200 From: Andre Oppermann <andre@freebsd.org> To: Luigi Rizzo <rizzo@icir.org> Cc: current@freebsd.org Subject: Re: potential bug in tcp_hostcache.c Message-ID: <4068933A.5090302@freebsd.org> In-Reply-To: <20040329130716.A26409@xorpc.icir.org> References: <20040329130716.A26409@xorpc.icir.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Luigi Rizzo wrote: > Hi, > while doing a backport to RELENG_4 of the tcp_hostcache stuff, > a student of mine found a potential bug in tcp_hc_purge(): > > in sys/netinet/tcp_hostcache.c:tcp_hc_purge() near line 714 > > for (i = 0; i < tcp_hostcache.hashsize; i++) { > THC_LOCK(&tcp_hostcache.hashbase[i].hch_mtx); > TAILQ_FOREACH(hc_entry, &tcp_hostcache.hashbase[i].hch_bucket, > rmx_q) { > if (all || hc_entry->rmx_expire <= 0) { > TAILQ_REMOVE(&tcp_hostcache.hashbase[i].hch_bucket, > hc_entry, rmx_q); > uma_zfree(tcp_hostcache.zone, hc_entry); > tcp_hostcache.hashbase[i].hch_length--; > tcp_hostcache.cache_count--; > } else > hc_entry->rmx_expire -= TCP_HOSTCACHE_PRUNE; > } > THC_UNLOCK(&tcp_hostcache.hashbase[i].hch_mtx); > > the TAILQ_FOREACH will dereference hc_entry after the struct has > been freed by uma_zfree() in the previous loop. While the code > seems to work because uma does not clobber the record, > the tcp_hostcache.zone is not locked around the loop so it > might well happen that some other thread will grab and overwrite > the record we are trying to use. > > > The usual range of possible fixes apply e.g. > > + struct hc_metrics *tmp = NULL; > ... > TAILQ_FOREACH(hc_entry, &tcp_hostcache.hashbase[i].hch_bucket, > rmx_q) { > + if (tmp) > + uma_zfree(tcp_hostcache.zone, tmp); > + tmp = NULL; > if (all || hc_entry->rmx_expire <= 0) { > TAILQ_REMOVE(&tcp_hostcache.hashbase[i].hch_bucket, > hc_entry, rmx_q); > uma_zfree(tcp_hostcache.zone, hc_entry); > tcp_hostcache.hashbase[i].hch_length--; > tcp_hostcache.cache_count--; > } else > hc_entry->rmx_expire -= TCP_HOSTCACHE_PRUNE; > } > + if (tmp) > + uma_zfree(tcp_hostcache.zone, tmp); > > Anyone going to commit a fix (this or something equivalent) > or i should do it ? Hi Luigi, I have not disappeared since you told me about the bug, I just had a very busy week. The fix is on my commit list and will go in shortly. -- Andre
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4068933A.5090302>