diff options
author | Jason Wang <jasowang@redhat.com> | 2016-02-15 12:52:34 +0800 |
---|---|---|
committer | Jason Wang <jasowang@redhat.com> | 2016-03-08 15:34:09 +0800 |
commit | 5dd2d45e344b50b018912b6d98ab47493f946eb6 (patch) | |
tree | 5e12eece82540693128f76977c61dfd3297aed7f /net | |
parent | 415ab35a441eca767d033a2702223e785b9d5190 (diff) | |
download | qemu-5dd2d45e344b50b018912b6d98ab47493f946eb6.tar.gz qemu-5dd2d45e344b50b018912b6d98ab47493f946eb6.tar.bz2 qemu-5dd2d45e344b50b018912b6d98ab47493f946eb6.zip |
net: filter: correctly remove filter from the list during finalization
Qemu may crash when we want to add two filters on the same netdev but
the initialization of second fails (e.g missing parameters):
./qemu-system-x86_64 -netdev user,id=un0 \
-object filter-buffer,id=f0,netdev=un0,interval=10 \
-object filter-buffer,id=f1,netdev=un0
Segmentation fault (core dumped)
This is because we don't check whether or not the filter was in the
list of netdev. This patch fixes this.
Cc: Yang Hongyang <hongyang.yang@easystack.cn>
Reviewed-by: Yang Hongyang <hongyang.yang@easystack.cn>
Signed-off-by: Jason Wang <jasowang@redhat.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/filter.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/net/filter.c b/net/filter.c index d2a514eb8d..7cdbc6c615 100644 --- a/net/filter.c +++ b/net/filter.c @@ -196,7 +196,8 @@ static void netfilter_finalize(Object *obj) nfc->cleanup(nf); } - if (nf->netdev && !QTAILQ_EMPTY(&nf->netdev->filters)) { + if (nf->netdev && !QTAILQ_EMPTY(&nf->netdev->filters) && + nf->next.tqe_prev) { QTAILQ_REMOVE(&nf->netdev->filters, nf, next); } g_free(nf->netdev_id); |