Browse Source

Merge branch 'master' into next

release0.1.6
Georg Hopp 12 years ago
parent
commit
b1536b32b8
  1. 1
      src/server/close_conn.c
  2. 25
      src/stream/read.c
  3. 30
      src/stream/write.c

1
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);

25
src/stream/read.c

@ -66,10 +66,29 @@ streamRead(Stream this, void * buf, size_t count)
case STREAM_SSL:
done = SSL_read((this->handle).ssl, buf, count);
if (0 >= done) {
if (0 == done) {
done = -2;
} else if (0 > done) {
switch (SSL_get_error((this->handle).ssl, done)) {
case SSL_ERROR_SYSCALL:
{
switch (errno) {
case EINTR:
case ENOBUFS:
case ENOMEM:
done = 0;
break;
case (EAGAIN|EWOULDBLOCK):
done = -1;
break;
default:
done = -1;
break;
}
}
break;
case SSL_ERROR_SSL:
case SSL_ERROR_SYSCALL:
{
unsigned long err;
@ -91,7 +110,7 @@ streamRead(Stream this, void * buf, size_t count)
break;
default:
done = 0;
done = -2;
break;
}

30
src/stream/write.c

@ -63,12 +63,36 @@ 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) {
if (0 == done) {
done = -2;
} else 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;
@ -90,7 +114,7 @@ streamWrite(Stream this, void * buf, size_t count)
break;
default:
done = 0;
done = -2;
break;
}

Loading…
Cancel
Save