fix IOBuf::reserve() when operating on a user-supplied buffer
authorAdam Simpkins <simpkins@fb.com>
Sun, 24 Nov 2013 23:46:46 +0000 (15:46 -0800)
committerJordan DeLong <jdelong@fb.com>
Fri, 20 Dec 2013 21:03:21 +0000 (13:03 -0800)
commit3d5106cd605ed237a5625dd8d45223075a57bcae
treeff73640b41dec762bd81d7fdfe2be2166e67cf96
parentbfa6ffb55e8a371130b1d391926afd3030a8cedc
fix IOBuf::reserve() when operating on a user-supplied buffer

Summary:
The IOBuf::reserveSlow() code assumed that external buffers were always
allocated with malloc.  This would cause problems when if reserve() was
ever used on a buffer created with IOBuf::takeOwnership().

This changes the code to now check if a user-specified free function has
been supplied.  If so, then it does not try to use realloc()/rallocm(),
and it now frees the old buffer using the specified free function rather
than free().

User-supplied buffers also have a separately allocated SharedInfo
object, which must be freed when we no longer need it.

Test Plan:
Added additional unit tests to check calling reserve() on IOBufs created
with IOBuf::takeOwnership().

Reviewed By: davejwatson@fb.com

FB internal diff: D1072292
folly/io/IOBuf.cpp
folly/io/IOBuf.h
folly/io/test/IOBufTest.cpp