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;
}
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;