mirror of https://gitee.com/openkylin/libvirt.git
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:
parent
f399612c56
commit
696becb658
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue