xref: /aosp_15_r20/external/harfbuzz_ng/test/fuzzing/hb-fuzzer.hh (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker #include <hb-config.hh>
2*2d1272b8SAndroid Build Coastguard Worker 
3*2d1272b8SAndroid Build Coastguard Worker #include <hb.h>
4*2d1272b8SAndroid Build Coastguard Worker #include <stddef.h>
5*2d1272b8SAndroid Build Coastguard Worker 
6*2d1272b8SAndroid Build Coastguard Worker extern "C" int LLVMFuzzerTestOneInput (const uint8_t *data, size_t size);
7*2d1272b8SAndroid Build Coastguard Worker 
8*2d1272b8SAndroid Build Coastguard Worker #if defined(__GNUC__) && (__GNUC__ >= 4) || (__clang__)
9*2d1272b8SAndroid Build Coastguard Worker #define HB_UNUSED	__attribute__((unused))
10*2d1272b8SAndroid Build Coastguard Worker #else
11*2d1272b8SAndroid Build Coastguard Worker #define HB_UNUSED
12*2d1272b8SAndroid Build Coastguard Worker #endif
13*2d1272b8SAndroid Build Coastguard Worker 
14*2d1272b8SAndroid Build Coastguard Worker #ifdef HB_IS_IN_FUZZER
15*2d1272b8SAndroid Build Coastguard Worker 
16*2d1272b8SAndroid Build Coastguard Worker /* See src/failing-alloc.c */
17*2d1272b8SAndroid Build Coastguard Worker extern "C" int alloc_state;
18*2d1272b8SAndroid Build Coastguard Worker 
19*2d1272b8SAndroid Build Coastguard Worker #else
20*2d1272b8SAndroid Build Coastguard Worker 
21*2d1272b8SAndroid Build Coastguard Worker /* Just a dummy global variable */
22*2d1272b8SAndroid Build Coastguard Worker static int HB_UNUSED alloc_state = 0;
23*2d1272b8SAndroid Build Coastguard Worker 
24*2d1272b8SAndroid Build Coastguard Worker #endif
25*2d1272b8SAndroid Build Coastguard Worker 
26*2d1272b8SAndroid Build Coastguard Worker static inline int
_fuzzing_alloc_state(const uint8_t * data,size_t size)27*2d1272b8SAndroid Build Coastguard Worker _fuzzing_alloc_state (const uint8_t *data, size_t size)
28*2d1272b8SAndroid Build Coastguard Worker {
29*2d1272b8SAndroid Build Coastguard Worker   /* https://github.com/harfbuzz/harfbuzz/pull/2764#issuecomment-1172589849 */
30*2d1272b8SAndroid Build Coastguard Worker 
31*2d1272b8SAndroid Build Coastguard Worker   /* In 50% of the runs, don't fail the allocator. */
32*2d1272b8SAndroid Build Coastguard Worker   if (size && data[size - 1] < 0x80)
33*2d1272b8SAndroid Build Coastguard Worker     return 0;
34*2d1272b8SAndroid Build Coastguard Worker 
35*2d1272b8SAndroid Build Coastguard Worker   return size;
36*2d1272b8SAndroid Build Coastguard Worker }
37