diff options
author | Paweł Chmielowski <pchmielowski@process-one.net> | 2012-04-06 11:53:21 +0200 |
---|---|---|
committer | Paweł Chmielowski <pchmielowski@process-one.net> | 2012-04-06 11:53:21 +0200 |
commit | af2e9169e6900a9228a0be09646dfff989f69f5b (patch) | |
tree | 97976c77aac0727eaf432af2bc2a80523c23a405 /src/tls/tls_drv.c | |
parent | Avoid 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.c | 13 |
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; |