use _ffi.from_buffer() to support bytearray by dholth · Pull Request #852 · pyca/pyopenssl (original) (raw)
Technically speaking, you should call ffi.release
on the cffi buffer after you're done with it. (Or, I think it has a context manager version too?)
The reason is: the way Python's buffer protocol works, as long as someone holds a reference to the raw data in the buffer, the original object is pinned. So for example, if you call from_buffer
on a bytearray, and then try to resize the bytearray, you'll get an error, because if python let you do that then the buffer would start pointing into nothingness. So that's great, but it means that if we go creating a buffer inside this function, then we need to make sure that buffer is gone again when we return to the user, or else they'll be very confused when attempting to resize their bytearray randomly fails depending on whether the buffer's been garbage collected or not.
Extra annoyances:
- the ability to explicitly release buffers was only added in cffi 0.12
- it's impossible to actually test this, because currently on cpython the refcount gc rooms destructors deterministically, while on pypy they haven't actually implemented the buffer locking functionality. But I think it's still a good idea, for future proofing.