Don't send back unknown program errors for async messages

If we send back an unknown program error for async messages,
we will confuse the client because they only expect replies
for method calls. Just log & drop any invalid async messages

* src/rpc/virnetserver.c: Don't send error for async messages
This commit is contained in:
Daniel P. Berrange 2011-10-06 10:58:05 +01:00
parent f399612c56
commit 696becb658
2 changed files with 31 additions and 5 deletions

View File

@ -134,10 +134,25 @@ static void virNetServerHandleJob(void *jobOpaque, void *opaque)
srv, job->client, job->msg, job->prog);
if (!job->prog) {
if (virNetServerProgramUnknownError(job->client,
job->msg,
&job->msg->header) < 0)
goto error;
/* Only send back an error for type == CALL. Other
* message types are not expecting replies, so we
* must just log it & drop them
*/
if (job->msg->header.type == VIR_NET_CALL) {
if (virNetServerProgramUnknownError(job->client,
job->msg,
&job->msg->header) < 0)
goto error;
} else {
VIR_INFO("Dropping client mesage, unknown program %d version %d type %d proc %d",
job->msg->header.prog, job->msg->header.vers,
job->msg->header.type, job->msg->header.proc);
/* Send a dummy reply to free up 'msg' & unblock client rx */
virNetMessageClear(job->msg);
job->msg->header.type = VIR_NET_REPLY;
if (virNetServerClientSendMessage(job->client, job->msg) < 0)
goto error;
}
goto cleanup;
}

View File

@ -314,7 +314,18 @@ int virNetServerProgramDispatch(virNetServerProgramPtr prog,
return ret;
error:
ret = virNetServerProgramSendReplyError(prog, client, msg, &rerr, &msg->header);
if (msg->header.type == VIR_NET_CALL) {
ret = virNetServerProgramSendReplyError(prog, client, msg, &rerr, &msg->header);
} else {
/* Send a dummy reply to free up 'msg' & unblock client rx */
virNetMessageClear(msg);
msg->header.type = VIR_NET_REPLY;
if (virNetServerClientSendMessage(client, msg) < 0) {
ret = -1;
goto cleanup;
}
ret = 0;
}
cleanup:
return ret;