diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2019-06-18 13:27:05 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2019-06-18 13:40:04 +0900 |
commit | 8b3774be3dd9f472bddd99e84e3c9fe2ff99d7ac (patch) | |
tree | 48a18447eefef52c3df17d5f52b5408fb4008e61 /string.c | |
parent | c770c98ac42ee20129f1296d9f7c4dad2ae45124 (diff) | |
download | ruby-8b3774be3dd9f472bddd99e84e3c9fe2ff99d7ac.tar.gz |
Fix memory leak
* string.c (str_make_independent_expand): free independent buffer.
[Bug# 15935]
Co-Authored-By: luke-gru (Luke Gruber) <luke.gru@gmail.com>
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 5 |
1 files changed, 4 insertions, 1 deletions
@@ -2069,7 +2069,7 @@ static void str_make_independent_expand(VALUE str, long len, long expand, const int termlen) { char *ptr; - const char *oldptr; + char *oldptr; long capa = len + expand; if (len > capa) len = capa; @@ -2088,6 +2088,9 @@ str_make_independent_expand(VALUE str, long len, long expand, const int termlen) if (oldptr) { memcpy(ptr, oldptr, len); } + if (FL_TEST_RAW(str, STR_NOEMBED|STR_NOFREE|STR_SHARED) == STR_NOEMBED) { + xfree(oldptr); + } STR_SET_NOEMBED(str); FL_UNSET(str, STR_SHARED|STR_NOFREE); TERM_FILL(ptr + len, termlen); |