Embedded SDK
Embedded SDK
Loading...
Searching...
No Matches
tlv_mutator.h
Go to the documentation of this file.
1#pragma once
11#include <stddef.h>
12#include <stdint.h>
13
15typedef struct {
16 uint8_t tag;
17 uint8_t min_len;
18 uint8_t max_len;
20
22typedef struct {
24 size_t num_tags;
26
29
31size_t tlv_custom_mutate(uint8_t *data, size_t size, size_t max_size, unsigned int seed);
32
33/* Indexed-grammar dispatch helper: picks the active command's grammar from configs[] and mutates
34 * the TLV tail, else falls back to fuzz_custom_mutator(). */
35#if defined(FUZZ_PREFIX_SIZE_FALLBACK) && defined(FUZZ_CTRL_OFF) && defined(fuzz_lane_is_structured)
36
37extern const size_t absolution_globals_size __attribute__((weak));
38extern const size_t fuzz_n_commands;
39size_t fuzz_custom_mutator(uint8_t *data, size_t size, size_t max_size, unsigned int seed);
40
41static inline size_t fuzz_tlv_dispatch_mutate(uint8_t *data,
42 size_t size,
43 size_t max_size,
44 unsigned int seed,
45 const tlv_fuzz_config_t *configs,
46 size_t n_configs)
47{
48 size_t ps = FUZZ_PREFIX_SIZE_FALLBACK;
49 if (&absolution_globals_size != NULL && absolution_globals_size != 0) {
50 ps = absolution_globals_size;
51 }
52
53 if (ps == 0 || ps + 6 >= max_size || size <= ps + 6) {
54 return fuzz_custom_mutator(data, size, max_size, seed);
55 }
56
57 uint8_t cmd_byte = fuzz_lane_is_structured(data, ps) ? data[FUZZ_CTRL_OFF + 1] : data[ps + 1];
58 size_t cmd_idx = cmd_byte % fuzz_n_commands;
59
60 if (cmd_idx >= n_configs || configs[cmd_idx].num_tags == 0 || (seed & 1U) != 0) {
61 return fuzz_custom_mutator(data, size, max_size, seed);
62 }
63
64 current_tlv_fuzz_config = configs[cmd_idx];
65
66 uint8_t *payload = data + ps + 4;
67 size_t payload_size = size - ps - 4;
68 size_t max_payload = max_size - ps - 4;
69
70 if (payload_size <= 2 || max_payload <= 2) {
71 return fuzz_custom_mutator(data, size, max_size, seed);
72 }
73
74 uint8_t *tlv_data = payload + 2;
75 size_t tlv_size = tlv_custom_mutate(tlv_data, payload_size - 2, max_payload - 2, seed >> 2);
76
77 payload[0] = (uint8_t) (tlv_size >> 8);
78 payload[1] = (uint8_t) (tlv_size & 0xFF);
79
80 return ps + 4 + 2 + tlv_size;
81}
82
83#endif
const size_t fuzz_n_commands
Number of entries in fuzz_commands.
const size_t absolution_globals_size __attribute__((weak))
static size_t fuzz_custom_mutator(uint8_t *data, size_t size, size_t max_size, unsigned int seed)
The TLV grammar the mutator currently applies (one per command).
Definition tlv_mutator.h:22
size_t num_tags
Number of entries in tags_info.
Definition tlv_mutator.h:24
const tlv_tag_info_t * tags_info
Array of allowed tags.
Definition tlv_mutator.h:23
Length bounds the mutator keeps for one TLV tag.
Definition tlv_mutator.h:15
uint8_t min_len
Minimum value length to emit.
Definition tlv_mutator.h:17
uint8_t tag
TLV tag byte.
Definition tlv_mutator.h:16
uint8_t max_len
Maximum value length to emit.
Definition tlv_mutator.h:18
tlv_fuzz_config_t current_tlv_fuzz_config
size_t tlv_custom_mutate(uint8_t *data, size_t size, size_t max_size, unsigned int seed)
Mutate a TLV byte range in place, preserving valid framing.