diff options
author | Jan Kiszka <jan.kiszka@siemens.com> | 2012-03-05 19:50:39 +0100 |
---|---|---|
committer | Jan Kiszka <jan.kiszka@siemens.com> | 2012-03-13 14:05:48 +0100 |
commit | 344de2562fd725d3900faa7c0e738c01dfdeacb1 (patch) | |
tree | fd12e87106b5d7f5c7501fa4f709fbae789f7d67 | |
parent | e9c188c5d109483b3d8bba0468303c298a87c314 (diff) | |
download | slirp-344de2562fd725d3900faa7c0e738c01dfdeacb1.zip slirp-344de2562fd725d3900faa7c0e738c01dfdeacb1.tar.gz slirp-344de2562fd725d3900faa7c0e738c01dfdeacb1.tar.bz2 |
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>
-rw-r--r-- | if.c | 11 | ||||
-rw-r--r-- | slirp.h | 1 |
2 files changed, 11 insertions, 1 deletions
@@ -159,10 +159,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 @@ -216,4 +223,6 @@ void if_start(Slirp *slirp) } 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_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 */ |