net: filter: correctly remove filter from the list during finalization
authorJason Wang <jasowang@redhat.com>
Mon, 15 Feb 2016 04:52:34 +0000 (12:52 +0800)
committerJason Wang <jasowang@redhat.com>
Tue, 8 Mar 2016 07:34:09 +0000 (15:34 +0800)
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>
net/filter.c

index d2a514eb8d2b8968e59e2a6e97b41c805e5abd88..7cdbc6c6158c0222bd51f10aee1b9e23da4259bf 100644 (file)
@@ -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);