slirp: Prevent recursion of if_start

if_start can be called recursively via if_encap. Avoid this as our
scheme of dequeuing packets is not compatible with this.

CC: Fabien Chouteau <chouteau@adacore.com>
CC: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
CC: Stefan Weil <sw@weilnetz.de>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
This commit is contained in:
Jan Kiszka 2012-03-05 19:50:39 +01:00
parent d6536b2c97
commit 953e7f54e6
2 changed files with 11 additions and 1 deletions

View file

@ -163,10 +163,17 @@ void if_start(Slirp *slirp)
DEBUG_CALL("if_start");
if (slirp->if_start_busy) {
return;
}
slirp->if_start_busy = true;
while (slirp->if_queued) {
/* check if we can really output */
if (!slirp_can_output(slirp->opaque))
if (!slirp_can_output(slirp->opaque)) {
slirp->if_start_busy = false;
return;
}
/*
* See which queue to get next packet from
@ -221,4 +228,6 @@ void if_start(Slirp *slirp)
}
slirp->if_queued = requeued;
slirp->if_start_busy = false;
}

View file

@ -239,6 +239,7 @@ struct Slirp {
struct mbuf if_fastq; /* fast queue (for interactive data) */
struct mbuf if_batchq; /* queue for non-interactive data */
struct mbuf *next_m; /* pointer to next mbuf to output */
bool if_start_busy; /* avoid if_start recursion */
/* ip states */
struct ipq ipq; /* ip reass. queue */