diff options
author | U.Nakamura <usa@ruby-lang.org> | 2023-07-25 20:18:30 +0900 |
---|---|---|
committer | U.Nakamura <usa@ruby-lang.org> | 2023-07-25 20:18:30 +0900 |
commit | e7c94d9d1d2bdbf396c489d1dc653c771f59bb92 (patch) | |
tree | 5b7da587015dcfd04e109bac8e64423a45316434 /io_buffer.c | |
parent | cba152ff1f69fad98f4c67747dcf763407cd1883 (diff) |
merge revision(s) 09295ea796900fb7b05d29e93364090e21598566: [Backport #19543]
IO::Buffer#resize: Free internal buffer if new size is zero (#7569)
`#resize(0)` on an IO::Buffer with internal buffer allocated will
result in calling `realloc(data->base, 0)`. The behavior of `realloc`
with size = 0 is implementation-defined (glibc frees the object
and returns NULL, while BSDs return an inaccessible object). And
thus such usage is deprecated in standard C (upcoming C23 will make it
UB).
To avoid this problem, just `free`s the memory when the new size is zero.
---
io_buffer.c | 5 +++++
test/ruby/test_io_buffer.rb | 18 ++++++++++++++++++
2 files changed, 23 insertions(+)
Diffstat (limited to 'io_buffer.c')
-rw-r--r-- | io_buffer.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/io_buffer.c b/io_buffer.c index 0ca6ec5632..5951f54fc4 100644 --- a/io_buffer.c +++ b/io_buffer.c @@ -1308,6 +1308,11 @@ rb_io_buffer_resize(VALUE self, size_t size) #endif if (data->flags & RB_IO_BUFFER_INTERNAL) { + if (size == 0) { + io_buffer_free(data); + return; + } + void *base = realloc(data->base, size); if (!base) { |