Skip to content

Commit 0d882a8

Browse files
authored
Merge pull request #261 from Shubham7-1/patch-1
Fix invalid memory write
2 parents 25ddeee + f55523a commit 0d882a8

File tree

1 file changed

+26
-34
lines changed

1 file changed

+26
-34
lines changed

fuzz/fuzz_config_read.c

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -93,49 +93,36 @@ size_t LLVMFuzzerCustomMutator(uint8_t *data, size_t size,
9393
srand(seed);
9494
config_init(&cfg);
9595

96-
fuzz_data_t *fuzz_data = (fuzz_data_t *) data;
97-
98-
// Ensure MIN_BUFF_SIZE * 2 <= size <= MAX_BUFF_SIZE
99-
if (remaining_size < MIN_BUFF_SIZE)
100-
{
101-
return 2 * MIN_BUFF_SIZE;
102-
}
103-
if (remaining_size > MAX_BUFF_SIZE)
104-
{
105-
return MAX_BUFF_SIZE;
96+
if (size < MIN_BUFF_SIZE || max_size < MIN_BUFF_SIZE || max_size > MAX_BUFF_SIZE) {
97+
return MIN_BUFF_SIZE;
10698
}
10799

108-
remaining_size -= MIN_BUFF_SIZE;
100+
fuzz_data_t *fuzz_data = (fuzz_data_t *) data;
101+
remaining_size -= sizeof(fuzz_data_t);
109102

110-
fuzz_data->lookup_type = rand() % (CONFIG_TYPE_LIST + 1);
103+
// Limit sizes to avoid overflow
104+
size_t max_content = min_size(remaining_size, MAX_CONFIG_SIZE - 1);
105+
fuzz_data->content_size = rand() % max_content;
111106

112-
// Ensure the content and path sizes are within bounds
113-
if (fuzz_data->content_size + fuzz_data->path_size > remaining_size)
114-
{
115-
fuzz_data->content_size = rand() % remaining_size;
116-
fuzz_data->path_size = remaining_size - fuzz_data->content_size;
107+
size_t max_path = min_size(remaining_size - fuzz_data->content_size, MAX_PATH_SIZE - 1);
108+
fuzz_data->path_size = rand() % max_path;
109+
110+
if (fuzz_data->content_size + fuzz_data->path_size + sizeof(fuzz_data_t) >= max_size) {
111+
fuzz_data->content_size = max_content / 2;
112+
fuzz_data->path_size = max_path / 2;
117113
}
118114

119-
// Extract and mutate the config
120115
fuzz_data_content(fuzz_data, &config_data);
121-
fuzz_data->content_size = LLVMFuzzerMutate(config_data, fuzz_data->content_size, remaining_size);
122-
config_data[fuzz_data->content_size] = '\0'; // Null-terminate the config
116+
fuzz_data_path(fuzz_data, &path_data);
123117

124-
if (fuzz_data->content_size > remaining_size) {
125-
return 0;
126-
}
118+
// Mutate content and path safely
119+
fuzz_data->content_size = LLVMFuzzerMutate(config_data, fuzz_data->content_size, max_content);
120+
config_data[fuzz_data->content_size < max_content ? fuzz_data->content_size : max_content - 1] = '\0';
127121

128-
remaining_size -= fuzz_data->content_size;
122+
fuzz_data->path_size = LLVMFuzzerMutate(path_data, fuzz_data->path_size, max_path);
123+
path_data[fuzz_data->path_size < max_path ? fuzz_data->path_size : max_path - 1] = '\0';
129124

130-
// Extract and mutate the path
131-
fuzz_data->path_size = min_size(fuzz_data->path_size, remaining_size);
132-
fuzz_data_path(fuzz_data, &path_data);
133-
if (remaining_size > 0) {
134-
fuzz_data->path_size = LLVMFuzzerMutate(path_data, fuzz_data->path_size, remaining_size);
135-
}
136-
path_data[fuzz_data->path_size] = '\0'; // Null-terminate the path
137-
138-
return min_size(MIN_BUFF_SIZE + fuzz_data->content_size + fuzz_data->path_size, max_size);
125+
return sizeof(fuzz_data_t) + fuzz_data->content_size + fuzz_data->path_size + 2;
139126
}
140127

141128
int LLVMFuzzerTestOneInput(const uint8_t *data, const size_t size)
@@ -169,6 +156,11 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, const size_t size)
169156

170157
config_init(&cfg);
171158

159+
if (fuzz_data->content_size > MAX_CONFIG_SIZE ||
160+
fuzz_data->path_size > MAX_PATH_SIZE ||
161+
sizeof(fuzz_data_t) + fuzz_data->content_size + fuzz_data->path_size > size) {
162+
goto end;
163+
}
172164
fuzz_data_content(fuzz_data, &config_ptr);
173165
fuzz_data_path(fuzz_data, &path_ptr);
174166
const char *config_data = (const char *) config_ptr;
@@ -243,4 +235,4 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, const size_t size)
243235
end:
244236
config_destroy(&cfg);
245237
return rc;
246-
}
238+
}

0 commit comments

Comments
 (0)