Coverage Report

Created: 2026-02-14 07:09

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