From 0d55c98addbac9c842c7643e8c4f24366c4ccc89 Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 22 Oct 2026 13:34:54 +0200 Subject: [PATCH] Inject fortified fread failures in sanitizer regressions --- tests/Makefile.am | 2 +- tests/test_media_primitives.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/Makefile.am b/tests/Makefile.am index 44a5ef6f..5b8c3f5f 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -864,7 +864,7 @@ check_PROGRAMS += test_media_primitives test_media_primitives_SOURCES = test_media_primitives.c test_media_primitives_LDADD = $(LIBUTUN) $(COMMON_LIBS) if OS_LINUX -test_media_primitives_LDFLAGS = -Wl,--wrap=fopen -Wl,--wrap=fdopen -Wl,--wrap=fread -Wl,--wrap=ferror \ +test_media_primitives_LDFLAGS = -Wl,--wrap=fopen -Wl,--wrap=fdopen -Wl,--wrap=fread -Wl,--wrap=__fread_chk -Wl,--wrap=ferror \ -Wl,--wrap=fwrite -Wl,--wrap=fflush -Wl,--wrap=fclose -Wl,--wrap=rename -Wl,--wrap=RAND_bytes \ -Wl,--wrap=opendir -Wl,--wrap=readdir -Wl,--wrap=closedir -Wl,--wrap=fseeko \ -Wl,--wrap=pthread_create -Wl,--wrap=u_calloc_impl -Wl,--wrap=uasync_post_reserved diff --git a/tests/test_media_primitives.c b/tests/test_media_primitives.c index 2f2524e9..83a7a02a 100644 --- a/tests/test_media_primitives.c +++ b/tests/test_media_primitives.c @@ -27,6 +27,7 @@ static pthread_barrier_t *post_barrier; extern FILE *__real_fopen(const char*, const char*); extern FILE *__real_fdopen(int, const char*); extern size_t __real_fread(void*, size_t, size_t, FILE*); +extern size_t __real___fread_chk(void*, size_t, size_t, size_t, FILE*); extern size_t __real_fwrite(const void*, size_t, size_t, FILE*); extern int __real_ferror(FILE*), __real_fflush(FILE*), __real_fclose(FILE*); extern int __real_rename(const char*, const char*), __real_RAND_bytes(unsigned char*, int); @@ -57,6 +58,11 @@ size_t __wrap_fread(void *data, size_t size, size_t count, FILE *file) { if (file == input_file && inject(READ)) { read_failed = 1; return 0; } return __real_fread(data, size, count, file); } +/* _FORTIFY_SOURCE при -Og вызывает checked-вариант; ошибка должна внедряться и в sanitizer-сборке. */ +size_t __wrap___fread_chk(void *data, size_t capacity, size_t size, size_t count, FILE *file) { + if (file == input_file && inject(READ)) { read_failed = 1; return 0; } + return __real___fread_chk(data, capacity, size, count, file); +} int __wrap_ferror(FILE *file) { return file == input_file && read_failed ? 1 : __real_ferror(file); } size_t __wrap_fwrite(const void *data, size_t size, size_t count, FILE *file) { return file == output_file && inject(WRITE) ? 0 : __real_fwrite(data, size, count, file);