Inject fortified fread failures in sanitizer regressions
This commit is contained in:
1 parent
5549a69b1c
commit
0d55c98add
2 files changed
+7
-1
No files matched your search
+1
-1
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user