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:
parent
d6536b2c97
commit
953e7f54e6
11
slirp/if.c
11
slirp/if.c
|
@ -163,10 +163,17 @@ void if_start(Slirp *slirp)
|
||||||
|
|
||||||
DEBUG_CALL("if_start");
|
DEBUG_CALL("if_start");
|
||||||
|
|
||||||
|
if (slirp->if_start_busy) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
slirp->if_start_busy = true;
|
||||||
|
|
||||||
while (slirp->if_queued) {
|
while (slirp->if_queued) {
|
||||||
/* check if we can really output */
|
/* check if we can really output */
|
||||||
if (!slirp_can_output(slirp->opaque))
|
if (!slirp_can_output(slirp->opaque)) {
|
||||||
|
slirp->if_start_busy = false;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* See which queue to get next packet from
|
* See which queue to get next packet from
|
||||||
|
@ -221,4 +228,6 @@ void if_start(Slirp *slirp)
|
||||||
}
|
}
|
||||||
|
|
||||||
slirp->if_queued = requeued;
|
slirp->if_queued = requeued;
|
||||||
|
|
||||||
|
slirp->if_start_busy = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,6 +239,7 @@ struct Slirp {
|
||||||
struct mbuf if_fastq; /* fast queue (for interactive data) */
|
struct mbuf if_fastq; /* fast queue (for interactive data) */
|
||||||
struct mbuf if_batchq; /* queue for non-interactive data */
|
struct mbuf if_batchq; /* queue for non-interactive data */
|
||||||
struct mbuf *next_m; /* pointer to next mbuf to output */
|
struct mbuf *next_m; /* pointer to next mbuf to output */
|
||||||
|
bool if_start_busy; /* avoid if_start recursion */
|
||||||
|
|
||||||
/* ip states */
|
/* ip states */
|
||||||
struct ipq ipq; /* ip reass. queue */
|
struct ipq ipq; /* ip reass. queue */
|
||||||
|
|
Loading…
Reference in a new issue