diff --git a/src/server/close_conn.c b/src/server/close_conn.c index 33d2dd4..ab5d9d1 100644 --- a/src/server/close_conn.c +++ b/src/server/close_conn.c @@ -39,6 +39,7 @@ serverCloseConn(Server this, unsigned int i) if (NULL != st && STREAM_SSL == st->type) { SSL_shutdown((st->handle).ssl); SSL_free((st->handle).ssl); + (st->handle).ssl = NULL; } delete(st); diff --git a/src/stream/write.c b/src/stream/write.c index f8e5899..edfc5e6 100644 --- a/src/stream/write.c +++ b/src/stream/write.c @@ -63,12 +63,34 @@ streamWrite(Stream this, void * buf, size_t count) break; case STREAM_SSL: + /* + * @TODO I got a segfault in this call under unclear + * circumstances. Most likely it has to do with a + * write on a closed connection. + */ done = SSL_write((this->handle).ssl, buf, count); if (0 >= done) { switch (SSL_get_error((this->handle).ssl, done)) { - case SSL_ERROR_SSL: case SSL_ERROR_SYSCALL: + { + switch (errno) { + case EINTR: + case ENOBUFS: + case ENOMEM: + done = 0; + break; + case (EAGAIN|EWOULDBLOCK): + done = -1; + break; + default: + done = -2; + break; + } + } + break; + + case SSL_ERROR_SSL: { unsigned long err; @@ -82,6 +104,7 @@ streamWrite(Stream this, void * buf, size_t count) // DROP THROUGH case SSL_ERROR_ZERO_RETURN: + default: done = -2; break; }