From: Daniel P. Berrange Date: Thu, 6 Oct 2011 09:58:05 +0000 (+0100) Subject: Don't send back unknown program errors for async messages X-Git-Tag: v0.9.7-rc1~177 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=696becb658b5faf84a1f7850cfb9df4dbb0e0fc4;p=thirdparty%2Flibvirt.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 --- diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c index 9588077334..f7397439b1 100644 --- a/src/rpc/virnetserver.c +++ b/src/rpc/virnetserver.c @@ -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; } diff --git a/src/rpc/virnetserverprogram.c b/src/rpc/virnetserverprogram.c index 334a0bf7a5..47b7deda77 100644 --- a/src/rpc/virnetserverprogram.c +++ b/src/rpc/virnetserverprogram.c @@ -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;