The RPC server accepts what it's given in the Content-Length header as fact, and does very little checking before allocating and doing a read() command. It also does all of this before evaluating IP filters via rpcallowip and before evaluating authentication information. Meaning if someone can connect to your RPC server they can exhaust some memory and exhaust all of your connections with little maintenance or network capacity.
This means you can do:
for i in seq 125; do
curl http://127.0.0.1:44555 -X POST -H "content-length: 30000000" -d "" &
done;
substituting 44555 with your RPC server's port and the loopback IP with the IP of your RPC server. This performs that way due to this code:
This is where it reads the content-length header https://github.com/bitcoin/bitcoin/blob/v0.9.2/src/rpcprotocol.cpp#L169-L170
Here's where it gets that header data, and uses it to allocate a buffer and starts a read() call which will never finish due to that amount of data not being there.
https://github.com/bitcoin/bitcoin/blob/v0.9.2/src/rpcprotocol.cpp#L185-L195
I understand this is not a huge issue as it's highly discouraged to allow any access to your RPC server's port, and it lacks basic functionality like timeouts to ensure clients do not exhaust its connections, but I thought of bringing this one up particularly because it trusts this value and allocates a buffer prior to authentication and evaluation of rpcallowip rules.