---
src/libvirt_remote.syms | 1 +
src/remote/remote_daemon_stream.c | 10 +++++++++-
src/rpc/virnetserverclient.c | 12 ++++++++++++
src/rpc/virnetserverclient.h | 2 ++
4 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/src/libvirt_remote.syms b/src/libvirt_remote.syms
index 0493467..c32e234 100644
--- a/src/libvirt_remote.syms
+++ b/src/libvirt_remote.syms
@@ -173,6 +173,7 @@ virNetServerClientPreExecRestart;
virNetServerClientRemoteAddrStringSASL;
virNetServerClientRemoteAddrStringURI;
virNetServerClientRemoveFilter;
+virNetServerClientCheckFilterExist;
virNetServerClientSendMessage;
virNetServerClientSetAuthLocked;
virNetServerClientSetAuthPendingLocked;
diff --git a/src/remote/remote_daemon_stream.c b/src/remote/remote_daemon_stream.c
index 82cadb6..de0dca3 100644
--- a/src/remote/remote_daemon_stream.c
+++ b/src/remote/remote_daemon_stream.c
@@ -292,10 +292,18 @@ daemonStreamFilter(virNetServerClientPtr client,
{
daemonClientStream *stream = opaque;
int ret = 0;
+ daemonClientPrivatePtr priv = NULL;
+ int filter_id = stream->filterID;
virObjectUnlock(client);
+ priv = virNetServerClientGetPrivateData(client);
virMutexLock(&stream->priv->lock);
virObjectLock(client);
+ if (!virNetServerClientCheckFilterExist(client, filter_id)) {
+ VIR_WARN("this daemon stream filter: %d have been deleted!",
filter_id);
+ ret = -1;
+ goto cleanup;
+ }
if (msg->header.type != VIR_NET_STREAM &&
msg->header.type != VIR_NET_STREAM_HOLE)
@@ -317,7 +325,7 @@ daemonStreamFilter(virNetServerClientPtr client,
ret = 1;
cleanup:
- virMutexUnlock(&stream->priv->lock);
+ virMutexUnlock(&priv->lock);
return ret;
}
diff --git a/src/rpc/virnetserverclient.c b/src/rpc/virnetserverclient.c
index 67b3bf9..f80f493 100644
--- a/src/rpc/virnetserverclient.c
+++ b/src/rpc/virnetserverclient.c
@@ -287,6 +287,18 @@ void virNetServerClientRemoveFilter(virNetServerClientPtr client,
virObjectUnlock(client);
}
+int virNetServerClientCheckFilterExist(virNetServerClientPtr client,
+ int filterID)
+{
+ virNetServerClientFilterPtr tmp;
+
+ tmp = client->filters;
+ while(tmp && tmp->id != filterID) {
+ tmp = tmp->next;
+ }
+
+ return (tmp != NULL);
+}
/* Check the client's access. */
static int
diff --git a/src/rpc/virnetserverclient.h b/src/rpc/virnetserverclient.h
index 7a3061d..85fda39 100644
--- a/src/rpc/virnetserverclient.h
+++ b/src/rpc/virnetserverclient.h
@@ -93,6 +93,8 @@ int virNetServerClientAddFilter(virNetServerClientPtr client,
void virNetServerClientRemoveFilter(virNetServerClientPtr client,
int filterID);
+int virNetServerClientCheckFilterExist(virNetServerClientPtr client,
+ int filterID);
int virNetServerClientGetAuth(virNetServerClientPtr client);
void virNetServerClientSetAuthLocked(virNetServerClientPtr client, int auth);
--
1.8.3.1