ref: 2bc9ba828f5c2d4663478bd94e125101851d1e9c
parent: 50a2da6d6d6ec151a9bd44942095303c6a7cdf7f
author: Janne Grunau <janne-vlc@jannau.net>
date: Thu Feb 7 18:43:25 EST 2019
dav1d_fuzzer_mem: test random pthread_* errors
--- a/tests/libfuzzer/alloc_fail.c
+++ b/tests/libfuzzer/alloc_fail.c
@@ -30,6 +30,7 @@
#include <stddef.h>
#include <stdlib.h>
#include <errno.h>
+#include <pthread.h>
#include "alloc_fail.h"
@@ -63,3 +64,39 @@
#else
#error "HAVE_POSIX_MEMALIGN required"
#endif
+
+int __wrap_pthread_create(pthread_t *, const pthread_attr_t *,
+ void *(*) (void *), void *);
+
+int __wrap_pthread_create(pthread_t *thread, const pthread_attr_t *attr,
+ void *(*start_routine) (void *), void *arg)
+{
+ if (rand() < (fail_probability + RAND_MAX/16))
+ return EAGAIN;
+
+ return pthread_create(thread, attr, start_routine, arg);
+}
+
+int __wrap_pthread_mutex_init(pthread_mutex_t *,
+ const pthread_mutexattr_t *);
+
+int __wrap_pthread_mutex_init(pthread_mutex_t *restrict mutex,
+ const pthread_mutexattr_t *restrict attr)
+{
+ if (rand() < (fail_probability + RAND_MAX/8))
+ return ENOMEM;
+
+ return pthread_mutex_init(mutex, attr);
+}
+
+int __wrap_pthread_cond_init(pthread_cond_t *,
+ const pthread_condattr_t *);
+
+int __wrap_pthread_cond_init(pthread_cond_t *restrict cond,
+ const pthread_condattr_t *restrict attr)
+{
+ if (rand() < (fail_probability + RAND_MAX/16))
+ return ENOMEM;
+
+ return pthread_cond_init(cond, attr);
+}
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -138,6 +138,9 @@
command: [objcopy,
'--redefine-sym', 'malloc=__wrap_malloc',
'--redefine-sym', 'posix_memalign=__wrap_posix_memalign',
+ '--redefine-sym', 'pthread_create=__wrap_pthread_create',
+ '--redefine-sym', 'pthread_cond_init=__wrap_pthread_cond_init',
+ '--redefine-sym', 'pthread_mutex_init=__wrap_pthread_mutex_init',
'@INPUT@', '@OUTPUT@'])
dav1d_fuzzer_mem = executable('dav1d_fuzzer_mem',