aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Cernekee <cernekee@chromium.org>2017-09-20 13:42:05 -0700
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2017-09-24 20:04:09 +0200
commiteff275e4ce57e25f9efd72efa1bae29f53de35e6 (patch)
tree7f16c85a636d7bcc10d82582ce78c4982eb428b9
parent3096116ff4a88acb3235b33b9c190996cd54b80c (diff)
downloadslirp-eff275e4ce57e25f9efd72efa1bae29f53de35e6.zip
slirp-eff275e4ce57e25f9efd72efa1bae29f53de35e6.tar.gz
slirp-eff275e4ce57e25f9efd72efa1bae29f53de35e6.tar.bz2
slirp: Add a special case for the NULL socket
NULL sockets are used for NDP, BOOTP, and other critical operations. If the topmost mbuf in a NULL session is blocked pending resolution, it may cause problems if it blocks other packets with a NULL socket. So do not add mbufs with a NULL socket field to the same session. Signed-off-by: Kevin Cernekee <cernekee@chromium.org> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
-rw-r--r--if.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/if.c b/if.c
index 05a2784..e72a891 100644
--- a/if.c
+++ b/if.c
@@ -70,13 +70,15 @@ void if_output(struct socket *so, struct mbuf *ifm)
* order)
* XXX add cache here?
*/
- for (ifq = (struct mbuf *)slirp->if_batchq.qh_rlink;
- (struct quehead *)ifq != &slirp->if_batchq; ifq = ifq->ifq_prev) {
- if (so == ifq->ifq_so) {
- /* A match! */
- ifm->ifq_so = so;
- ifs_insque(ifm, ifq->ifs_prev);
- goto diddit;
+ if (so) {
+ for (ifq = (struct mbuf *)slirp->if_batchq.qh_rlink;
+ (struct quehead *)ifq != &slirp->if_batchq; ifq = ifq->ifq_prev) {
+ if (so == ifq->ifq_so) {
+ /* A match! */
+ ifm->ifq_so = so;
+ ifs_insque(ifm, ifq->ifs_prev);
+ goto diddit;
+ }
}
}