12 #define LVL_BUF_BITS 3
14 #define LEVEL_BIT_MASK ((1<<LEVEL_BITS) - 1)
15 #define HEADER_BIT_MASK ((1<<HEADER_BITS) - 1)
16 #define TYPE0_HDR_SIZE 5
17 #define TYPE0_MAX_SIZE 65535
19 #define MIN(x,y) (((x) > (y)) ? y : x )
21 const int header_size
[] = {
24 0, //IGZIP_GZIP_NO_HDR
26 0, //IGZIP_ZLIB_NO_HDR
29 const int trailer_size
[] = {
32 8, //IGZIP_GZIP_NO_HDR
34 4, //IGZIP_ZLIB_NO_HDR
37 int LLVMFuzzerTestOneInput(const uint8_t * data
, size_t size
)
39 struct inflate_state istate
;
40 struct isal_zstream cstate
;
41 uint8_t *in_data
= (uint8_t *) data
;
46 int lev_buf_size
= ISAL_DEF_LVL1_DEFAULT
;
48 size_t cmp_buf_size
= size
+ ISAL_DEF_MAX_HDR_SIZE
;
50 // Parameters are set by one byte of data input
52 uint8_t in_param
= in_data
[--size
];
53 level
= MIN(in_param
& LEVEL_BIT_MASK
, ISAL_DEF_MAX_LEVEL
);
54 in_param
>>= LEVEL_BITS
;
56 wrapper_type
= (in_param
& HEADER_BIT_MASK
) % (IGZIP_ZLIB_NO_HDR
+ 1);
57 in_param
>>= HEADER_BITS
;
61 lev_buf_size
= ISAL_DEF_LVL0_MIN
+ (in_param
) *
62 (ISAL_DEF_LVL0_EXTRA_LARGE
/ LEVEL_BIT_MASK
);
65 lev_buf_size
= ISAL_DEF_LVL1_MIN
+ (in_param
) *
66 (ISAL_DEF_LVL1_EXTRA_LARGE
/ LEVEL_BIT_MASK
);
68 #ifdef ISAL_DEF_LVL2_MIN
70 lev_buf_size
= ISAL_DEF_LVL2_MIN
+ (in_param
) *
71 (ISAL_DEF_LVL2_EXTRA_LARGE
/ LEVEL_BIT_MASK
);
74 #ifdef ISAL_DEF_LVL3_MIN
76 lev_buf_size
= ISAL_DEF_LVL3_MIN
+ (in_param
) *
77 (ISAL_DEF_LVL3_EXTRA_LARGE
/ LEVEL_BIT_MASK
);
82 cmp_buf_size
= 2 * size
+ ISAL_DEF_MAX_HDR_SIZE
;
84 cmp_buf_size
= size
+ 8 + (TYPE0_HDR_SIZE
* (size
/ TYPE0_MAX_SIZE
));
86 cmp_buf_size
+= header_size
[wrapper_type
] + trailer_size
[wrapper_type
];
89 uint8_t *isal_cmp_buf
= (uint8_t *) malloc(cmp_buf_size
);
90 uint8_t *isal_out_buf
= (uint8_t *) malloc(size
);
91 uint8_t *isal_lev_buf
= (uint8_t *) malloc(lev_buf_size
);
92 assert(NULL
!= isal_cmp_buf
|| NULL
!= isal_out_buf
|| NULL
!= isal_lev_buf
);
94 isal_deflate_init(&cstate
);
95 cstate
.end_of_stream
= 1;
96 cstate
.flush
= NO_FLUSH
;
97 cstate
.next_in
= in_data
;
98 cstate
.avail_in
= size
;
99 cstate
.next_out
= isal_cmp_buf
;
100 cstate
.avail_out
= cmp_buf_size
;
101 cstate
.level
= level
;
102 cstate
.level_buf
= isal_lev_buf
;
103 cstate
.level_buf_size
= lev_buf_size
;
104 cstate
.gzip_flag
= wrapper_type
;
105 ret
= isal_deflate_stateless(&cstate
);
107 isal_inflate_init(&istate
);
108 istate
.next_in
= isal_cmp_buf
;
109 istate
.avail_in
= cstate
.total_out
;
110 istate
.next_out
= isal_out_buf
;
111 istate
.avail_out
= size
;
112 istate
.crc_flag
= wrapper_type
;
113 ret
|= isal_inflate_stateless(&istate
);
114 ret
|= memcmp(isal_out_buf
, in_data
, size
);
118 int trailer_idx
= cstate
.total_out
- trailer_size
[wrapper_type
];
120 if (wrapper_type
== IGZIP_GZIP
|| wrapper_type
== IGZIP_GZIP_NO_HDR
)
121 crc
= load_u32(&isal_cmp_buf
[trailer_idx
]);
122 else if (wrapper_type
== IGZIP_ZLIB
|| wrapper_type
== IGZIP_ZLIB_NO_HDR
)
123 crc
= bswap_32(load_u32(&isal_cmp_buf
[trailer_idx
]));
125 assert(istate
.crc
== crc
);