From 91619f0230c0e5a95c796c1bd4f784c151e15614 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Wed, 28 Jan 2026 13:39:33 +0100 Subject: gc.c: Verify provided size in `rb_gc_impl_free` For now the provided size is just for GC statistics, but in the future we may want to forward it to C23's `free_sized` and passing an incorrect size to it is undefined behavior. --- string.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'string.c') diff --git a/string.c b/string.c index a36eb6e9f3..3cfc77600b 100644 --- a/string.c +++ b/string.c @@ -1559,7 +1559,7 @@ rb_str_tmp_frozen_no_embed_acquire(VALUE orig) } RSTRING(str)->len = RSTRING(orig)->len; - RSTRING(str)->as.heap.aux.capa = capa; + RSTRING(str)->as.heap.aux.capa = capa + (TERM_LEN(orig) - TERM_LEN(str)); return str; } @@ -3135,7 +3135,7 @@ str_subseq(VALUE str, long beg, long len) const int termlen = TERM_LEN(str); if (!SHARABLE_SUBSTRING_P(beg, len, RSTRING_LEN(str))) { - str2 = rb_str_new(RSTRING_PTR(str) + beg, len); + str2 = rb_enc_str_new(RSTRING_PTR(str) + beg, len, rb_str_enc_get(str)); RB_GC_GUARD(str); return str2; } @@ -7814,7 +7814,7 @@ mapping_buffer_free(void *p) while (current_buffer) { previous_buffer = current_buffer; current_buffer = current_buffer->next; - ruby_sized_xfree(previous_buffer, previous_buffer->capa); + ruby_sized_xfree(previous_buffer, offsetof(mapping_buffer, space) + previous_buffer->capa); } } -- cgit v1.2.3