aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@siemens.com>2012-03-05 19:50:39 +0100
committerJan Kiszka <jan.kiszka@siemens.com>2012-03-13 14:05:48 +0100
commit344de2562fd725d3900faa7c0e738c01dfdeacb1 (patch)
treefd12e87106b5d7f5c7501fa4f709fbae789f7d67
parente9c188c5d109483b3d8bba0468303c298a87c314 (diff)
downloadslirp-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.c11
-rw-r--r--slirp.h1
2 files changed, 11 insertions, 1 deletions
diff --git a/if.c b/if.c
index a9e68cf..ff9f572 100644
--- a/if.c
+++ b/if.c
@@ -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;
}
diff --git a/slirp.h b/slirp.h
index 27e3b8c..4c76187 100644
--- a/slirp.h
+++ b/slirp.h
@@ -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 */