Commit cf12ebc5 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Fix broken logic in the poll-fd compaction function, which resulted in

a panic during this sequence:

	varnishd -d -d -T :8082
	ctrl-D
	telnet localhost 8082 (from other terminal)



git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@2722 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 7c9b7957
......@@ -373,23 +373,26 @@ ev_compact_pfd(struct evbase *evb)
unsigned u;
struct pollfd *p;
struct ev *ep;
int lfd;
DBG(evb, "compact_pfd() lpfd = %d\n", evb->lpfd);
p = evb->pfd;
ep = VTAILQ_FIRST(&evb->events);
for (u = 0; u < evb->lpfd; u++, p++) {
DBG(evb, "...[%d] fd = %d\n", u, p->fd);
if (p->fd >= 0)
continue;
for(; ep != NULL; ep = VTAILQ_NEXT(ep, __list)) {
if (ep->fd >= 0 && ep->__poll_idx > u)
lfd = evb->pfd[evb->lpfd - 1].fd;
VTAILQ_FOREACH(ep, &evb->events, __list)
if (ep->fd == lfd)
break;
}
if (ep == NULL)
break;
*p = evb->pfd[ep->__poll_idx];
AN(ep);
DBG(evb, "...[%d] move %p pidx %d\n", u, ep, ep->__poll_idx);
*p = evb->pfd[--evb->lpfd];
ep->__poll_idx = u;
}
evb->lpfd = u;
evb->compact_pfd = 0;
DBG(evb, "... lpfd = %d\n", evb->lpfd);
}
/*--------------------------------------------------------------------*/
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment