]> granicus.if.org Git - libevent/commit
Avoid potential SSL read spinlocks
authorMark Ellzey <mark.thomas@mandiant.com>
Mon, 14 Nov 2011 15:24:07 +0000 (10:24 -0500)
committerNick Mathewson <nickm@torproject.org>
Mon, 14 Nov 2011 16:52:51 +0000 (11:52 -0500)
commitfc52dbac87f4937f8306759506d6a2ad15ca244c
tree28c96d045b8571010409f62a41c2a9976728e756
parenta3f320e83d97dbd58afa883d8a1e2cf3cdc1ac39
Avoid potential SSL read spinlocks

OpenSSL bufferevents with deferred callbacks enabled under high load will
spinlock in the function consider_reading(). This loop continues until all
data has been read.

Because of this condition; openssl bufferevents will never return back into
event_base_loop() until SSL_read has determined data is no longer ready.

As of yet I have not found a reason why this while loop exists, so this patch
just swaps out while for if.

If needed I can write same code which would trigger this effect; optionally
libevhtp has a test.c program which can be run with the following flags:

./test -s <keyfile.pem>

curl -vvvv -k -d@<HUGE_ASS_FILE> https://127.0.0.1:8081/

The return data will include the number of times the readcb got data and the
length of that read.

Without this patch, you are likely to see a small amount of "bytes read....",
otherwise the "bytes read..." return data should show much more reasonable
numbers.
bufferevent_openssl.c