From 30ac11e74b346cde5c6ce892488325f90b079da7 Mon Sep 17 00:00:00 2001 From: kichikuou Date: Mon, 16 Feb 2026 08:49:33 +0900 Subject: [PATCH] Fix use-after-free in custom string array sort Custom comparison functions for string arrays receive their arguments by value. Create a copy of the strings before pushing them to the stack to prevent them from being prematurely freed after the function call. --- src/page.c | 14 +++++++++++++- test/Run/test.ain | Bin 27937 -> 28572 bytes test/Source/arrays.jaf | 25 +++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/page.c b/src/page.c index fac61c0..0a0ab70 100644 --- a/src/page.c +++ b/src/page.c @@ -557,6 +557,17 @@ static int array_compare_custom(const void *_a, const void *_b) return d ? d : a->index - b->index; } +static int array_compare_custom_string(const void *_a, const void *_b) +{ + const struct sortable *a = _a; + const struct sortable *b = _b; + stack_push(vm_string_ref(heap_get_string(a->v.i))); + stack_push(vm_string_ref(heap_get_string(b->v.i))); + vm_call(current_sort_function, -1); + int d = stack_pop().i; + return d ? d : a->index - b->index; +} + void array_sort(struct page *page, int compare_fno) { if (!page) @@ -569,7 +580,8 @@ void array_sort(struct page *page, int compare_fno) values[i].index = i; } current_sort_function = compare_fno; - qsort(values, page->nr_vars, sizeof(struct sortable), array_compare_custom); + qsort(values, page->nr_vars, sizeof(struct sortable), + page->a_type == AIN_ARRAY_STRING ? array_compare_custom_string : array_compare_custom); for (int i = 0; i < page->nr_vars; i++) { page->values[i] = values[i].v; } diff --git a/test/Run/test.ain b/test/Run/test.ain index 7509a2378803a22e39484cbcef2aed5bad46e37f..93f2e6afc4479693ac2a841bf9bc6fb29526a857 100644 GIT binary patch delta 16930 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

>b{THCj4JlOH_V8}dxc$XEG0jVq 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 b) return 1; + return 0; +} + +void test_array_sort_custom_string(void) +{ + int i; + bool failed = false; + array@string ar; + ar.PushBack("4"); + ar.PushBack("1"); + ar.PushBack("3"); + ar.PushBack("0"); + ar.PushBack("2"); + ar.Sort(&compare_string); + for (i = 0; i < 5 && !failed; i++) { + failed = ar[i] != "%d" % i; + } + test_bool("string_array.Sort()", !failed, true); +} + int ctor_ctr = 0; struct array_ctor { @@ -285,6 +309,7 @@ void test_arrays(void) test_array_sort_float(); test_array_sort_string(); test_array_sort_custom(); + test_array_sort_custom_string(); test_array_constructors(); test_array_push_struct_with_ref(); }