aboutsummaryrefslogtreecommitdiff
path: root/src/tls/tls_drv.c
diff options
context:
space:
mode:
authorPaweł Chmielowski <pchmielowski@process-one.net>2012-04-06 11:53:21 +0200
committerPaweł Chmielowski <pchmielowski@process-one.net>2012-04-06 11:53:21 +0200
commitaf2e9169e6900a9228a0be09646dfff989f69f5b (patch)
tree97976c77aac0727eaf432af2bc2a80523c23a405 /src/tls/tls_drv.c
parentAvoid quadratic behavior in reading SSL data (diff)
Don't ignore Length parameter in tls:recv
Diffstat (limited to 'src/tls/tls_drv.c')
-rw-r--r--src/tls/tls_drv.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/tls/tls_drv.c b/src/tls/tls_drv.c
index e680cde65..d0774684c 100644
--- a/src/tls/tls_drv.c
+++ b/src/tls/tls_drv.c
@@ -432,13 +432,22 @@ static ErlDrvSSizeT tls_drv_control(ErlDrvData handle,
"SSL_do_handshake failed");
}
if (SSL_is_init_finished(d->ssl)) {
+ size_t req_size = 0;
+ if (len == 4)
+ {
+ req_size =
+ (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
+ }
size = BUF_SIZE + 1;
rlen = 1;
b = driver_alloc_binary(size);
b->orig_bytes[0] = 0;
- while ((res = SSL_read(d->ssl,
- b->orig_bytes + rlen, BUF_SIZE)) > 0)
+ while ((req_size == 0 || rlen < req_size + 1) &&
+ (res = SSL_read(d->ssl,
+ b->orig_bytes + rlen,
+ (req_size == 0 || req_size + 1 >= size) ?
+ size - rlen : req_size + 1 - rlen)) > 0)
{
//printf("%d bytes of decrypted data read from state machine\r\n",res);
rlen += res;