diff options
author | Kevin Cernekee <cernekee@chromium.org> | 2017-09-20 13:42:05 -0700 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2017-09-24 20:04:09 +0200 |
commit | eff275e4ce57e25f9efd72efa1bae29f53de35e6 (patch) | |
tree | 7f16c85a636d7bcc10d82582ce78c4982eb428b9 | |
parent | 3096116ff4a88acb3235b33b9c190996cd54b80c (diff) | |
download | slirp-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.c | 16 |
1 files changed, 9 insertions, 7 deletions
@@ -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; + } } } |