From: Samuel Thibault Date: Thu, 24 Aug 2017 23:35:53 +0000 (+0200) Subject: slirp: fix clearing ifq_so from pending packets X-Git-Tag: v2.9.1~27 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=62708c7c1236f6219f9395f00faf8ce655a2aec6;hp=746e1fd00094b6fa13ec6a9cc3f9d7437c0f9d81;p=mirror_qemu.git slirp: fix clearing ifq_so from pending packets The if_fastq and if_batchq contain not only packets, but queues of packets for the same socket. When sofree frees a socket, it thus has to clear ifq_so from all the packets from the queues, not only the first. Signed-off-by: Samuel Thibault Reviewed-by: Philippe Mathieu-Daudé Cc: qemu-stable@nongnu.org Signed-off-by: Peter Maydell (cherry picked from commit 1201d308519f1e915866d7583d5136d03cc1d384) Signed-off-by: Michael Roth --- diff --git a/slirp/socket.c b/slirp/socket.c index 86927722e1..29443269f7 100644 --- a/slirp/socket.c +++ b/slirp/socket.c @@ -59,6 +59,27 @@ socreate(Slirp *slirp) return(so); } +/* + * Remove references to so from the given message queue. + */ +static void +soqfree(struct socket *so, struct quehead *qh) +{ + struct mbuf *ifq; + + for (ifq = (struct mbuf *) qh->qh_link; + (struct quehead *) ifq != qh; + ifq = ifq->ifq_next) { + if (ifq->ifq_so == so) { + struct mbuf *ifm; + ifq->ifq_so = NULL; + for (ifm = ifq->ifs_next; ifm != ifq; ifm = ifm->ifs_next) { + ifm->ifq_so = NULL; + } + } + } +} + /* * remque and free a socket, clobber cache */ @@ -66,23 +87,9 @@ void sofree(struct socket *so) { Slirp *slirp = so->slirp; - struct mbuf *ifm; - for (ifm = (struct mbuf *) slirp->if_fastq.qh_link; - (struct quehead *) ifm != &slirp->if_fastq; - ifm = ifm->ifq_next) { - if (ifm->ifq_so == so) { - ifm->ifq_so = NULL; - } - } - - for (ifm = (struct mbuf *) slirp->if_batchq.qh_link; - (struct quehead *) ifm != &slirp->if_batchq; - ifm = ifm->ifq_next) { - if (ifm->ifq_so == so) { - ifm->ifq_so = NULL; - } - } + soqfree(so, &slirp->if_fastq); + soqfree(so, &slirp->if_batchq); if (so->so_emu==EMU_RSH && so->extra) { sofree(so->extra);