From 54b2c860cd090e2560f01b35a54d94ba7f400a07 Mon Sep 17 00:00:00 2001 From: CreeperFace <165158232+dy-tea@users.noreply.github.com> Date: Sat, 22 Nov 2025 07:53:54 +0000 Subject: [PATCH] builtin,cgen: ensure array of string is not cloned with depth 0 (fix #25783) (#25793) --- vlib/builtin/array.v | 7 +++++++ vlib/os/os_args_autofree_test.v | 14 ++++++++++++++ vlib/v/gen/c/cgen.v | 2 ++ 3 files changed, 23 insertions(+) create mode 100644 vlib/os/os_args_autofree_test.v diff --git a/vlib/builtin/array.v b/vlib/builtin/array.v index 6ad22afef..5955e0819 100644 --- a/vlib/builtin/array.v +++ b/vlib/builtin/array.v @@ -724,6 +724,13 @@ pub fn (a &array) clone_to_depth(depth int) array { unsafe { arr.set_unsafe(i, &ar_clone) } } return arr + } else if depth > 0 && a.element_size == sizeof(string) && a.len >= 0 && a.cap >= a.len { + for i in 0 .. a.len { + str_ptr := unsafe { &string(a.get_unsafe(i)) } + str_clone := (*str_ptr).clone() + unsafe { arr.set_unsafe(i, &str_clone) } + } + return arr } else { if a.data != 0 && source_capacity_in_bytes > 0 { unsafe { vmemcpy(&u8(arr.data), a.data, source_capacity_in_bytes) } diff --git a/vlib/os/os_args_autofree_test.v b/vlib/os/os_args_autofree_test.v new file mode 100644 index 000000000..8a999dde1 --- /dev/null +++ b/vlib/os/os_args_autofree_test.v @@ -0,0 +1,14 @@ +// vtest build: !sanitize-memory-gcc && !sanitize-address-gcc && !sanitize-address-clang +// vtest vflags: -autofree +import os + +fn test_os_args_no_double_free() { + args := os.args + assert args.len > 0 +} + +fn test_os_args_clone() { + a1 := os.args + a2 := os.args + assert a1 == a2 +} diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 154d1e104..0085c1a6d 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -8531,6 +8531,8 @@ pub fn (mut g Gen) get_array_depth(el_typ ast.Type) int { if sym.kind == .array { info := sym.info as ast.Array return 1 + g.get_array_depth(info.elem_type) + } else if sym.kind in [.string, .map] { + return 1 } else { return 0 } -- 2.39.5