Coverage Report

Created: 2026-10-17 06:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/c-blosc2/tests/fuzz/fuzz_compress_chunk.c
Line
Count
Source
1
#include <stdint.h>
2
#include <stdlib.h>
3
4
#include <blosc2.h>
5
6
17.9k
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
7
8
#ifdef __cplusplus
9
extern "C" {
10
#endif
11
12
17.9k
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
13
17.9k
  const char *const compressors[] = { "blosclz", "lz4", "lz4hc", "zlib", "zstd" };
14
17.9k
  const int num_comp = ARRAY_SIZE(compressors);
15
17.9k
  int level = 9, filter = BLOSC_BITSHUFFLE, cindex = 0, i = 0;
16
17.9k
  size_t nbytes, cbytes, blocksize;
17
17.9k
  void *output, *input;
18
19
17.9k
  blosc2_set_nthreads(1);
20
21
17.9k
  if (size > 0)
22
17.9k
    level = data[0] % (9 + 1);
23
17.9k
  if (size > 1)
24
17.9k
    filter = data[1] % (BLOSC_BITSHUFFLE + 1);
25
17.9k
  if (size > 2)
26
17.9k
    cindex = data[2];
27
28
  /* Find next available compressor */
29
17.9k
  while (blosc1_set_compressor(compressors[cindex % num_comp]) == -1 && i < num_comp) {
30
0
    cindex++, i++;
31
0
  }
32
17.9k
  if (i == num_comp) {
33
    /* No compressors available */
34
0
    return 0;
35
0
  }
36
37
17.9k
  if (size > 3 && data[3] % 7 == 0)
38
3.77k
    blosc1_set_blocksize(4096);
39
40
17.9k
  output = malloc(size + 1);
41
17.9k
  if (output == NULL)
42
0
    return 0;
43
44
17.9k
  int csize = blosc2_compress(level, filter, 1, data, size, output, size);
45
17.9k
  if (csize <= 0) {
46
    /* Cannot compress src buffer into dest */
47
6.71k
    free(output);
48
6.71k
    return 0;
49
6.71k
  }
50
51
11.2k
  blosc1_cbuffer_sizes(output, &nbytes, &cbytes, &blocksize);
52
53
  /* Don't allow address sanitizer to allocate more than INT32_MAX */
54
11.2k
  if (cbytes >= INT32_MAX) {
55
0
    free(output);
56
0
    return 0;
57
0
  }
58
59
11.2k
  input = malloc(cbytes);
60
11.2k
  if (input != NULL) {
61
11.2k
    blosc1_decompress(output, input, cbytes);
62
11.2k
    free(input);
63
11.2k
  }
64
65
11.2k
  free(output);
66
67
11.2k
  return 0;
68
11.2k
}
69
70
#ifdef __cplusplus
71
}
72
#endif