From 3db7b4489486380e02c46c84525f34c3e25be787 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 8 Apr 2024 12:48:05 -0300 Subject: [PATCH] os: fix double free in os.get_raw_line() (used by os.input), with `-autofree` (#21204) --- vlib/os/os.c.v | 8 +++++--- vlib/v/slow_tests/valgrind/free_heap_foos.c.v | 4 ++-- .../free_variables_in_reverse_order_of_creation.c.v | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/vlib/os/os.c.v b/vlib/os/os.c.v index b37f6777a..4d0f9704e 100644 --- a/vlib/os/os.c.v +++ b/vlib/os/os.c.v @@ -539,9 +539,11 @@ pub fn get_raw_line() string { nr_chars := unsafe { C.getline(&buf, &max, C.stdin) } str := unsafe { tos(&u8(buf), if nr_chars < 0 { 0 } else { nr_chars }) } ret := str.clone() - unsafe { - if nr_chars > 0 && buf != 0 { - C.free(buf) + $if !autofree { + unsafe { + if nr_chars > 0 && buf != 0 { + C.free(buf) + } } } return ret diff --git a/vlib/v/slow_tests/valgrind/free_heap_foos.c.v b/vlib/v/slow_tests/valgrind/free_heap_foos.c.v index 727b190cd..a4d745025 100644 --- a/vlib/v/slow_tests/valgrind/free_heap_foos.c.v +++ b/vlib/v/slow_tests/valgrind/free_heap_foos.c.v @@ -31,13 +31,13 @@ fn create_some_foos() { fn main() { create_some_foos() - if C._VAUTOFREE == 1 { + $if autofree { assert frees.len == 2 assert frees[0] == 222 assert frees[1] == 111 } create_some_foos() - if C._VAUTOFREE == 1 { + $if autofree { assert frees.len == 4 assert frees[0] == 222 assert frees[1] == 111 diff --git a/vlib/v/slow_tests/valgrind/free_variables_in_reverse_order_of_creation.c.v b/vlib/v/slow_tests/valgrind/free_variables_in_reverse_order_of_creation.c.v index 32d81ba2f..a95edeacc 100644 --- a/vlib/v/slow_tests/valgrind/free_variables_in_reverse_order_of_creation.c.v +++ b/vlib/v/slow_tests/valgrind/free_variables_in_reverse_order_of_creation.c.v @@ -25,7 +25,7 @@ fn use_some_returned_variables() { println(dd) } b := test(2) - if C._VAUTOFREE == 1 { + $if autofree { assert frees.len == 2 assert frees[0] == 444 assert frees[1] == 333 @@ -35,7 +35,7 @@ fn use_some_returned_variables() { fn main() { use_some_returned_variables() - if C._VAUTOFREE == 1 { + $if autofree { assert frees.len == 4 assert frees[0] == 444 assert frees[1] == 333 -- 2.39.5