Inject fortified fread failures in sanitizer regressions

This commit is contained in:
evgeny committed 2026-10-22 13:34:54 +02:00
1 parent 5549a69b1c
commit 0d55c98add
2 files changed
+7 -1

No files matched your search

+1 -1
View File
@@ -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
+6
View File
@@ -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);