Compare commits

...

3 commits

Author SHA1 Message Date
cgzones
6944950da4
Merge 9ca3279507 into a000fd4b5e 2025-11-16 00:01:37 +01:00
charles25565
a000fd4b5e Bump minimum AOSP version to QPR1 2025-11-15 17:04:35 -05:00
Christian Göttsche
9ca3279507 test: add tests for zero sized realloc(3)
C23 declared calling realloc(3) with a non-NULL pointer and zero size
Undefined behavior.
Check that hardened_malloc handles that case sanely by free'ing the old
pointer and returning a special pointer, like `malloc(3)` called with
size zero.
2025-04-05 16:55:41 +02:00
7 changed files with 81 additions and 2 deletions

View file

@ -83,7 +83,7 @@ there will be custom integration offering better performance in the future
along with other hardening for the C standard library implementation. along with other hardening for the C standard library implementation.
For Android, only the current generation, actively developed maintenance branch of the Android For Android, only the current generation, actively developed maintenance branch of the Android
Open Source Project will be supported, which currently means `android16-release`. Open Source Project will be supported, which currently means `android16-qpr1-release`.
## Testing ## Testing

3
test/.gitignore vendored
View file

@ -41,4 +41,7 @@ overflow_small_8_byte
uninitialized_read_large uninitialized_read_large
uninitialized_read_small uninitialized_read_small
realloc_init realloc_init
realloc_c23_undefined_behaviour
realloc_c23_undefined_behaviour_double_free
realloc_c23_undefined_behaviour_use_after_free
__pycache__/ __pycache__/

View file

@ -67,7 +67,10 @@ EXECUTABLES := \
invalid_malloc_object_size_small \ invalid_malloc_object_size_small \
invalid_malloc_object_size_small_quarantine \ invalid_malloc_object_size_small_quarantine \
impossibly_large_malloc \ impossibly_large_malloc \
realloc_init realloc_init \
realloc_c23_undefined_behaviour \
realloc_c23_undefined_behaviour_double_free \
realloc_c23_undefined_behaviour_use_after_free
all: $(EXECUTABLES) all: $(EXECUTABLES)

View file

@ -0,0 +1,19 @@
#include <stdio.h>
#include <stdlib.h>
#include "test_util.h"
OPTNONE int main(void) {
char *p, *q, *r;
p = malloc(16);
if (!p) {
return 1;
}
q = realloc(p, 0);
free(q);
return 0;
}

View file

@ -0,0 +1,19 @@
#include <stdio.h>
#include <stdlib.h>
#include "test_util.h"
OPTNONE int main(void) {
char *p, *q, *r;
p = malloc(16);
if (!p) {
return 1;
}
q = realloc(p, 0);
free(p);
return 0;
}

View file

@ -0,0 +1,21 @@
#include <stdio.h>
#include <stdlib.h>
#include "test_util.h"
OPTNONE int main(void) {
char *p, *q, *r;
p = malloc(256 * 1024);
if (!p) {
return 1;
}
q = realloc(p, 0);
printf("%c\n", *p);
free(q);
return 0;
}

View file

@ -169,6 +169,20 @@ class TestSimpleMemoryCorruption(unittest.TestCase):
self.assertEqual(stderr.decode("utf-8"), self.assertEqual(stderr.decode("utf-8"),
"fatal allocator error: invalid realloc\n") "fatal allocator error: invalid realloc\n")
def test_realloc_c23_undefined_behaviour(self):
_stdout, stderr, returncode = self.run_test("realloc_c23_undefined_behaviour")
self.assertEqual(returncode, 0)
def test_realloc_c23_undefined_behaviour_double_free(self):
_stdout, stderr, returncode = self.run_test("realloc_c23_undefined_behaviour_double_free")
self.assertEqual(returncode, -6)
self.assertEqual(stderr.decode("utf-8"),
"fatal allocator error: double free (quarantine)\n")
def test_realloc_c23_undefined_behaviour_use_after_free(self):
_stdout, stderr, returncode = self.run_test("realloc_c23_undefined_behaviour_use_after_free")
self.assertEqual(returncode, -11)
def test_write_after_free_large_reuse(self): def test_write_after_free_large_reuse(self):
_stdout, _stderr, returncode = self.run_test( _stdout, _stderr, returncode = self.run_test(
"write_after_free_large_reuse") "write_after_free_large_reuse")