
On Tue, Nov 01, 2011 at 02:14:54PM +0100, Michal Privoznik wrote:
If daemon is using SASL it reads client data into a cache. This cache is big (usually 65KB) and can thus contain 2 or more messages. However, on socket event we can dispatch only one message. So if we read two messages at once, the second will not be dispatched as the socket event goes away with filling the cache. Moreover, when dispatching the cache we need to remember to take care of client max requests limit. --- src/rpc/virnetserverclient.c | 34 +++++++++++++++++++++++++++++++++- 1 files changed, 33 insertions(+), 1 deletions(-)
diff --git a/src/rpc/virnetserverclient.c b/src/rpc/virnetserverclient.c index 1256f0f..69af746 100644 --- a/src/rpc/virnetserverclient.c +++ b/src/rpc/virnetserverclient.c @@ -71,6 +71,8 @@ struct _virNetServerClient virNetTLSSessionPtr tls; #if HAVE_SASL virNetSASLSessionPtr sasl; + int sasl_timer; /* Timer to be fired upon cached data, + so we jump out from poll() immediately */ #endif
Agreed with other comments that this shouldn't be #if HAVE_SASL protected - we might someday hit this in other cases. Just call it sockTimer or something like that.
@@ -204,6 +220,19 @@ static void virNetServerClientUpdateEvent(virNetServerClientPtr client) mode = virNetServerClientCalculateHandleMode(client);
virNetSocketUpdateIOCallback(client->sock, mode); +#ifdef HAVE_SASL + if (client->nrequests < client->nrequests_max &&
This line is bogus. We set client->rx to non-NULL, if-and-only-if client->nrequests < client->nrequests_max. We don't want to duplicate this check here.
+ client->rx && + virNetSocketHasCachedData(client->sock)) { + if (client->sasl_timer) + virEventUpdateTimeout(client->sasl_timer, 0); + else + client->sasl_timer = virEventAddTimeout(0, + virNetServerClientDispatchReadTimerFunc, + client, + NULL); + } +#endif
Missing a check for failure of virEventAddTimeout. I would have unconditionally setup the timer with period -1, during the constructor virNetServerClientNew. Then we can just use virEventUpdateTimeout which is guaranteed to not fail. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|