提交 c69ba670 编写于 作者: D Daniel P. Berrange

Fix release of virNetMessagePtr instances in streams processing

If a message packet for a invalid stream is received it is just
free'd. This is not good because it doesn't let the client RPC
request counter decrement. If a stream is shutdown with pending
packets the message also isn't released properly because of an
incorrect header type

* daemon/stream.c: Fix message header type
* src/rpc/virnetserverprogram.c: Send dummy reply instead of
  free'ing ignored stream message
上级 f1c2c0e2
...@@ -327,6 +327,7 @@ int daemonFreeClientStream(virNetServerClientPtr client, ...@@ -327,6 +327,7 @@ int daemonFreeClientStream(virNetServerClientPtr client,
virNetMessagePtr tmp = msg->next; virNetMessagePtr tmp = msg->next;
/* Send a dummy reply to free up 'msg' & unblock client rx */ /* Send a dummy reply to free up 'msg' & unblock client rx */
memset(msg, 0, sizeof(*msg)); memset(msg, 0, sizeof(*msg));
msg->header.type = VIR_NET_REPLY;
if (virNetServerClientSendMessage(client, msg) < 0) { if (virNetServerClientSendMessage(client, msg) < 0) {
virNetServerClientMarkClose(client); virNetServerClientMarkClose(client);
virNetMessageFree(msg); virNetMessageFree(msg);
......
...@@ -259,7 +259,13 @@ int virNetServerProgramDispatch(virNetServerProgramPtr prog, ...@@ -259,7 +259,13 @@ int virNetServerProgramDispatch(virNetServerProgramPtr prog,
*/ */
VIR_INFO("Ignoring unexpected stream data serial=%d proc=%d status=%d", VIR_INFO("Ignoring unexpected stream data serial=%d proc=%d status=%d",
msg->header.serial, msg->header.proc, msg->header.status); msg->header.serial, msg->header.proc, msg->header.status);
virNetMessageFree(msg); /* Send a dummy reply to free up 'msg' & unblock client rx */
memset(msg, 0, sizeof(*msg));
msg->header.type = VIR_NET_REPLY;
if (virNetServerClientSendMessage(client, msg) < 0) {
ret = -1;
goto cleanup;
}
ret = 0; ret = 0;
break; break;
...@@ -275,6 +281,7 @@ int virNetServerProgramDispatch(virNetServerProgramPtr prog, ...@@ -275,6 +281,7 @@ int virNetServerProgramDispatch(virNetServerProgramPtr prog,
error: error:
ret = virNetServerProgramSendReplyError(prog, client, msg, &rerr, &msg->header); ret = virNetServerProgramSendReplyError(prog, client, msg, &rerr, &msg->header);
cleanup:
return ret; return ret;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册