Skip to content

Commit 7acc0df

Browse files
committed
fix fuzzifier errors
1 parent 8a7a645 commit 7acc0df

3 files changed

Lines changed: 44 additions & 1 deletion

File tree

src/spss/readstat_sav_parse_mr_name.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,5 +512,23 @@ readstat_error_t parse_mr_string(const char *line, mr_set_t **mr_sets, size_t *n
512512
(void)mr_parser_en_main;
513513

514514
cleanup:
515+
if (retval != READSTAT_OK && *mr_sets != NULL) {
516+
// Free all successfully parsed MR sets
517+
for (size_t i = 0; i < *n_mr_lines; i++) {
518+
if ((*mr_sets)[i].name != NULL) free((*mr_sets)[i].name);
519+
if ((*mr_sets)[i].label != NULL) free((*mr_sets)[i].label);
520+
if ((*mr_sets)[i].subvariables != NULL) {
521+
for (size_t j = 0; j < (*mr_sets)[i].num_subvars; j++) {
522+
if ((*mr_sets)[i].subvariables[j] != NULL) {
523+
free((*mr_sets)[i].subvariables[j]);
524+
}
525+
}
526+
free((*mr_sets)[i].subvariables);
527+
}
528+
}
529+
free(*mr_sets);
530+
*mr_sets = NULL;
531+
*n_mr_lines = 0;
532+
}
515533
return retval;
516534
}

src/spss/readstat_sav_parse_mr_name.rl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,5 +235,23 @@ readstat_error_t parse_mr_string(const char *line, mr_set_t **mr_sets, size_t *n
235235
(void)mr_parser_en_main;
236236

237237
cleanup:
238+
if (retval != READSTAT_OK && *mr_sets != NULL) {
239+
// Free all successfully parsed MR sets
240+
for (size_t i = 0; i < *n_mr_lines; i++) {
241+
if ((*mr_sets)[i].name != NULL) free((*mr_sets)[i].name);
242+
if ((*mr_sets)[i].label != NULL) free((*mr_sets)[i].label);
243+
if ((*mr_sets)[i].subvariables != NULL) {
244+
for (size_t j = 0; j < (*mr_sets)[i].num_subvars; j++) {
245+
if ((*mr_sets)[i].subvariables[j] != NULL) {
246+
free((*mr_sets)[i].subvariables[j]);
247+
}
248+
}
249+
free((*mr_sets)[i].subvariables);
250+
}
251+
}
252+
free(*mr_sets);
253+
*mr_sets = NULL;
254+
*n_mr_lines = 0;
255+
}
238256
return retval;
239257
}

src/spss/readstat_sav_read.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1383,14 +1383,21 @@ static readstat_error_t sav_parse_records_pass1(sav_ctx_t *ctx) {
13831383
ctx->multiple_response_sets_length = 0;
13841384

13851385
retval = sav_read_multiple_response_sets(data_len, ctx);
1386-
if (retval != READSTAT_OK)
1386+
if (retval != READSTAT_OK) {
1387+
// Restore old MR sets to context so they get cleaned up properly
1388+
ctx->mr_sets = old_mr_sets;
1389+
ctx->multiple_response_sets_length = old_count;
13871390
goto cleanup;
1391+
}
13881392

13891393
// Merge with existing MR sets if any
13901394
if (old_mr_sets != NULL && old_count > 0) {
13911395
size_t total_count = old_count + ctx->multiple_response_sets_length;
13921396
mr_set_t *merged = readstat_realloc(old_mr_sets, total_count * sizeof(mr_set_t));
13931397
if (merged == NULL) {
1398+
// Restore old MR sets to context so they get cleaned up properly
1399+
ctx->mr_sets = old_mr_sets;
1400+
ctx->multiple_response_sets_length = old_count;
13941401
retval = READSTAT_ERROR_MALLOC;
13951402
goto cleanup;
13961403
}

0 commit comments

Comments
 (0)