}
if(hub->queue.size > 1000)
sk->ignread = 1;
- else
- sk->ignread = 0;
}
static void huberr(struct socket *sk, int err, struct fnetnode *fn)
if((newbuf = sockgetinbuf(sk, &datalen)) == NULL)
return;
- if(peer->inbufdata > 500000) /* Discard possibly malicious data */
- peer->inbufdata = 0;
sizebuf2(peer->inbuf, peer->inbufdata + datalen, 1);
memcpy(peer->inbuf + peer->inbufdata, newbuf, datalen);
free(newbuf);
peer->state = PEER_STOP;
break;
} else {
- if(peer->queue.size > 1000)
+ if(peer->queue.size > 50)
sk->ignread = 1;
- else
- sk->ignread = 0;
}
}
} else if(peer->state == PEER_TTHL) {
handletthl(peer);
}
+ if(peer->inbufdata > 500000)
+ sk->ignread = 1;
}
static void peererror(struct socket *sk, int err, struct dcpeer *peer)
struct dchub *hub;
struct dcpeer *peer, *nextpeer;
struct qcommand *qcmd;
- int ret;
+ int ret, quota;
ret = 0;
+ quota = 20;
for(fn = fnetnodes; fn != NULL; fn = nextfn)
{
nextfn = fn->next;
if(fn->data == NULL)
continue;
hub = (struct dchub *)fn->data;
- if((qcmd = ulqcmd(&hub->queue)) != NULL)
+ while((quota > 0) && ((qcmd = ulqcmd(&hub->queue)) != NULL))
{
if(*qcmd->string == '$')
{
}
freeqcmd(qcmd);
ret = 1;
- break;
+ quota--;
}
+ if(hub->queue.size < 1000)
+ hub->sk->ignread = 0;
+ if(quota < 1)
+ break;
}
+ quota = 20;
for(peer = peers; peer != NULL; peer = nextpeer)
{
nextpeer = peer->next;
- if((qcmd = ulqcmd(&peer->queue)) != NULL)
+ while((quota > 0) && ((qcmd = ulqcmd(&peer->queue)) != NULL))
{
if(peer->timeout != NULL)
canceltimer(peer->timeout);
dispatchcommand(qcmd, peercmds, peer->sk, peer);
freeqcmd(qcmd);
ret = 1;
- break;
+ quota--;
}
+ if((peer->queue.size < 50) && (peer->inbufdata < 500000))
+ peer->sk->ignread = 0;
+ if(quota < 1)
+ break;
}
return(ret);
}