@@ -93,49 +93,36 @@ size_t LLVMFuzzerCustomMutator(uint8_t *data, size_t size,
93
93
srand (seed );
94
94
config_init (& cfg );
95
95
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 ;
106
98
}
107
99
108
- remaining_size -= MIN_BUFF_SIZE ;
100
+ fuzz_data_t * fuzz_data = (fuzz_data_t * ) data ;
101
+ remaining_size -= sizeof (fuzz_data_t );
109
102
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 ;
111
106
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 ;
117
113
}
118
114
119
- // Extract and mutate the config
120
115
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 );
123
117
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' ;
127
121
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' ;
129
124
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 ;
139
126
}
140
127
141
128
int LLVMFuzzerTestOneInput (const uint8_t * data , const size_t size )
@@ -169,6 +156,11 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, const size_t size)
169
156
170
157
config_init (& cfg );
171
158
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
+ }
172
164
fuzz_data_content (fuzz_data , & config_ptr );
173
165
fuzz_data_path (fuzz_data , & path_ptr );
174
166
const char * config_data = (const char * ) config_ptr ;
@@ -243,4 +235,4 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, const size_t size)
243
235
end :
244
236
config_destroy (& cfg );
245
237
return rc ;
246
- }
238
+ }
0 commit comments