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

Fix deadlock when the RPC program is unknown

Commit 597fe3ce accidentally
introduced a deadlock when reporting an unknown RPC program.
The virNetServerDispatchNewMessage method is called with
the client locked, and must therefore not attempt to send
any RPC messages back to the client. Only once the incoming
message is passed off to the virNetServerHandleJob worker
is it safe to start sending messages back

* src/rpc/virnetserver.c: Delay checking for unknown RPC
  program until in worker thread
上级 fd52b968
......@@ -133,6 +133,14 @@ static void virNetServerHandleJob(void *jobOpaque, void *opaque)
VIR_DEBUG("server=%p client=%p message=%p prog=%p",
srv, job->client, job->msg, job->prog);
if (!job->prog) {
if (virNetServerProgramUnknownError(job->client,
job->msg,
&job->msg->header) < 0)
goto error;
goto cleanup;
}
if (virNetServerProgramDispatch(job->prog,
srv,
job->client,
......@@ -142,6 +150,8 @@ static void virNetServerHandleJob(void *jobOpaque, void *opaque)
virNetServerLock(srv);
virNetServerProgramFree(job->prog);
virNetServerUnlock(srv);
cleanup:
virNetServerClientFree(job->client);
VIR_FREE(job);
return;
......@@ -184,18 +194,14 @@ static int virNetServerDispatchNewMessage(virNetServerClientPtr client,
}
}
if (!prog) {
virNetServerProgramUnknownError(client, msg, &msg->header);
goto cleanup;
if (prog) {
virNetServerProgramRef(prog);
job->prog = prog;
priority = virNetServerProgramGetPriority(prog, msg->header.proc);
}
virNetServerProgramRef(prog);
job->prog = prog;
priority = virNetServerProgramGetPriority(prog, msg->header.proc);
ret = virThreadPoolSendJob(srv->workers, priority, job);
cleanup:
if (ret < 0) {
VIR_FREE(job);
virNetServerProgramFree(prog);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册