summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul J Stevens <paul@nfg.nl>2010-07-24 22:29:39 +0200
committerPaul J Stevens <paul@nfg.nl>2010-07-24 22:29:39 +0200
commitb3d01587d113a9cd3bc639a3fff1f5abf3946c84 (patch)
treeb0b2d0d1c6c903ea18aae3ce9de1a343f0acc957
parente13dc19a858e27bc87dcc47107ed485f341dda51 (diff)
prevent spinlock in ssl session
break the loop in case of EAGAIN errors during ssl-writes.
-rw-r--r--src/clientbase.c4
-rw-r--r--src/server.c3
2 files changed, 5 insertions, 2 deletions
diff --git a/src/clientbase.c b/src/clientbase.c
index 206804f3..cbf99d5a 100644
--- a/src/clientbase.c
+++ b/src/clientbase.c
@@ -303,8 +303,10 @@ int ci_write(clientbase_t *self, char * msg, ...)
if (t == -1) {
if ((e = self->cb_error(self->tx, e, (void *)self))) {
self->client_state |= CLIENT_ERR;
- return e;
+ } else {
+ event_add(self->wev, NULL);
}
+ return e;
} else {
TRACE(TRACE_INFO, "[%p] S > [%ld/%ld:%s]", self, t, self->write_buffer->len, s);
diff --git a/src/server.c b/src/server.c
index dd757cf2..8eca2604 100644
--- a/src/server.c
+++ b/src/server.c
@@ -140,8 +140,9 @@ void dm_thread_data_sendmessage(gpointer data)
{
dm_thread_data *D = (dm_thread_data *)data;
ImapSession *session = (ImapSession *)D->session;
- if (D->data && session)
+ if (D->data && session) {
ci_write(session->ci, "%s", (char *)D->data);
+ }
}
/*