1*08b48e0bSAndroid Build Coastguard Worker #include <stdarg.h>
2*08b48e0bSAndroid Build Coastguard Worker #include <stddef.h>
3*08b48e0bSAndroid Build Coastguard Worker #include <setjmp.h>
4*08b48e0bSAndroid Build Coastguard Worker #include <assert.h>
5*08b48e0bSAndroid Build Coastguard Worker #include <cmocka.h>
6*08b48e0bSAndroid Build Coastguard Worker #include <sys/stat.h>
7*08b48e0bSAndroid Build Coastguard Worker #include <fcntl.h>
8*08b48e0bSAndroid Build Coastguard Worker /* cmocka < 1.0 didn't support these features we need */
9*08b48e0bSAndroid Build Coastguard Worker #ifndef assert_ptr_equal
10*08b48e0bSAndroid Build Coastguard Worker #define assert_ptr_equal(a, b) \
11*08b48e0bSAndroid Build Coastguard Worker _assert_int_equal(cast_ptr_to_largest_integral_type(a), \
12*08b48e0bSAndroid Build Coastguard Worker cast_ptr_to_largest_integral_type(b), \
13*08b48e0bSAndroid Build Coastguard Worker __FILE__, __LINE__)
14*08b48e0bSAndroid Build Coastguard Worker #define CMUnitTest UnitTest
15*08b48e0bSAndroid Build Coastguard Worker #define cmocka_unit_test unit_test
16*08b48e0bSAndroid Build Coastguard Worker #define cmocka_run_group_tests(t, setup, teardown) run_tests(t)
17*08b48e0bSAndroid Build Coastguard Worker #endif
18*08b48e0bSAndroid Build Coastguard Worker
19*08b48e0bSAndroid Build Coastguard Worker
20*08b48e0bSAndroid Build Coastguard Worker extern void mock_assert(const int result, const char* const expression,
21*08b48e0bSAndroid Build Coastguard Worker const char * const file, const int line);
22*08b48e0bSAndroid Build Coastguard Worker #undef assert
23*08b48e0bSAndroid Build Coastguard Worker #define assert(expression) \
24*08b48e0bSAndroid Build Coastguard Worker mock_assert((int)(expression), #expression, __FILE__, __LINE__);
25*08b48e0bSAndroid Build Coastguard Worker
26*08b48e0bSAndroid Build Coastguard Worker #include "afl-fuzz.h"
27*08b48e0bSAndroid Build Coastguard Worker
28*08b48e0bSAndroid Build Coastguard Worker /* remap exit -> assert, then use cmocka's mock_assert
29*08b48e0bSAndroid Build Coastguard Worker (compile with `--wrap=exit`) */
30*08b48e0bSAndroid Build Coastguard Worker extern void exit(int status);
31*08b48e0bSAndroid Build Coastguard Worker extern void __real_exit(int status);
32*08b48e0bSAndroid Build Coastguard Worker //void __wrap_exit(int status);
__wrap_exit(int status)33*08b48e0bSAndroid Build Coastguard Worker void __wrap_exit(int status) {
34*08b48e0bSAndroid Build Coastguard Worker (void)status;
35*08b48e0bSAndroid Build Coastguard Worker assert(0);
36*08b48e0bSAndroid Build Coastguard Worker }
37*08b48e0bSAndroid Build Coastguard Worker
38*08b48e0bSAndroid Build Coastguard Worker /* ignore all printfs */
39*08b48e0bSAndroid Build Coastguard Worker #undef printf
40*08b48e0bSAndroid Build Coastguard Worker extern int printf(const char *format, ...);
41*08b48e0bSAndroid Build Coastguard Worker extern int __real_printf(const char *format, ...);
42*08b48e0bSAndroid Build Coastguard Worker int __wrap_printf(const char *format, ...);
__wrap_printf(const char * format,...)43*08b48e0bSAndroid Build Coastguard Worker int __wrap_printf(const char *format, ...) {
44*08b48e0bSAndroid Build Coastguard Worker (void)format;
45*08b48e0bSAndroid Build Coastguard Worker return 1;
46*08b48e0bSAndroid Build Coastguard Worker }
47*08b48e0bSAndroid Build Coastguard Worker
48*08b48e0bSAndroid Build Coastguard Worker /* Rand with 0 seed would broke in the past */
test_rand_0(void ** state)49*08b48e0bSAndroid Build Coastguard Worker static void test_rand_0(void **state) {
50*08b48e0bSAndroid Build Coastguard Worker (void)state;
51*08b48e0bSAndroid Build Coastguard Worker
52*08b48e0bSAndroid Build Coastguard Worker afl_state_t afl = {0};
53*08b48e0bSAndroid Build Coastguard Worker rand_set_seed(&afl, 0);
54*08b48e0bSAndroid Build Coastguard Worker
55*08b48e0bSAndroid Build Coastguard Worker /* give this one chance to retry */
56*08b48e0bSAndroid Build Coastguard Worker assert_int_not_equal(
57*08b48e0bSAndroid Build Coastguard Worker (rand_next(&afl) != rand_next(&afl)
58*08b48e0bSAndroid Build Coastguard Worker || rand_next(&afl) != rand_next(&afl))
59*08b48e0bSAndroid Build Coastguard Worker , 0);
60*08b48e0bSAndroid Build Coastguard Worker
61*08b48e0bSAndroid Build Coastguard Worker }
62*08b48e0bSAndroid Build Coastguard Worker
test_rand_below(void ** state)63*08b48e0bSAndroid Build Coastguard Worker static void test_rand_below(void **state) {
64*08b48e0bSAndroid Build Coastguard Worker (void)state;
65*08b48e0bSAndroid Build Coastguard Worker
66*08b48e0bSAndroid Build Coastguard Worker afl_state_t afl = {0};
67*08b48e0bSAndroid Build Coastguard Worker rand_set_seed(&afl, 1337);
68*08b48e0bSAndroid Build Coastguard Worker
69*08b48e0bSAndroid Build Coastguard Worker afl.fsrv.dev_urandom_fd = open("/dev/urandom", O_RDONLY);
70*08b48e0bSAndroid Build Coastguard Worker if (afl.fsrv.dev_urandom_fd < 0) { PFATAL("Unable to open /dev/urandom"); }
71*08b48e0bSAndroid Build Coastguard Worker
72*08b48e0bSAndroid Build Coastguard Worker assert(!(rand_below(&afl, 9000) > 9000));
73*08b48e0bSAndroid Build Coastguard Worker assert_int_equal(rand_below(&afl, 1), 0);
74*08b48e0bSAndroid Build Coastguard Worker
75*08b48e0bSAndroid Build Coastguard Worker }
76*08b48e0bSAndroid Build Coastguard Worker
main(int argc,char ** argv)77*08b48e0bSAndroid Build Coastguard Worker int main(int argc, char **argv) {
78*08b48e0bSAndroid Build Coastguard Worker (void)argc;
79*08b48e0bSAndroid Build Coastguard Worker (void)argv;
80*08b48e0bSAndroid Build Coastguard Worker
81*08b48e0bSAndroid Build Coastguard Worker const struct CMUnitTest tests[] = {
82*08b48e0bSAndroid Build Coastguard Worker cmocka_unit_test(test_rand_0),
83*08b48e0bSAndroid Build Coastguard Worker cmocka_unit_test(test_rand_below)
84*08b48e0bSAndroid Build Coastguard Worker };
85*08b48e0bSAndroid Build Coastguard Worker
86*08b48e0bSAndroid Build Coastguard Worker //return cmocka_run_group_tests (tests, setup, teardown);
87*08b48e0bSAndroid Build Coastguard Worker __real_exit( cmocka_run_group_tests (tests, NULL, NULL) );
88*08b48e0bSAndroid Build Coastguard Worker
89*08b48e0bSAndroid Build Coastguard Worker // fake return for dumb compilers
90*08b48e0bSAndroid Build Coastguard Worker return 0;
91*08b48e0bSAndroid Build Coastguard Worker }
92