Skip to content

Commit 81d956b

Browse files
boxerabtlsa
authored andcommitted
css_property_parser_gen: improve memory management
1 parent 020999e commit 81d956b

File tree

1 file changed

+51
-31
lines changed

1 file changed

+51
-31
lines changed

src/parse/properties/css_property_parser_gen.c

Lines changed: 51 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -549,16 +549,17 @@ int main(int argc, char **argv)
549549
bool only_ident = true; /* if the only token type is ident */
550550
bool is_generic = false;
551551

552-
struct keyval_list base;
553-
struct keyval_list IDENT;
554-
struct keyval_list IDENT_LIST;
555-
struct keyval_list LENGTH_UNIT;
556-
struct keyval_list URI;
557-
struct keyval_list WRAP;
558-
struct keyval_list NUMBER;
559-
struct keyval_list COLOR;
560-
struct keyval_list CALC;
561-
552+
struct keyval_list base = {0};
553+
struct keyval_list IDENT = {0};
554+
struct keyval_list IDENT_LIST = {0};
555+
struct keyval_list LENGTH_UNIT = {0};
556+
struct keyval_list URI = {0};
557+
struct keyval_list WRAP = {0};
558+
struct keyval_list NUMBER = {0};
559+
struct keyval_list COLOR = {0};
560+
struct keyval_list CALC = {0};
561+
562+
int ret = 0;
562563

563564
if (argc < 2) {
564565
fprintf(stderr,"Usage: %s [-o <filename>] <descriptor>\n", argv[0]);
@@ -580,31 +581,27 @@ int main(int argc, char **argv)
580581
outputf = stdout;
581582
descriptor = strdup(argv[1]);
582583
}
584+
if (!descriptor) {
585+
if (outputf != stdout) fclose(outputf);
586+
return 2;
587+
}
583588
curpos = descriptor;
584589

585-
base.count = 0;
586-
IDENT.count = 0;
587-
URI.count = 0;
588-
WRAP.count = 0;
589-
NUMBER.count = 0;
590-
COLOR.count = 0;
591-
LENGTH_UNIT.count = 0;
592-
IDENT_LIST.count = 0;
593-
CALC.count = 0;
594-
595590
curlist = &base;
596591

597592
while (*curpos != 0) {
593+
bool rkv_needs_free = true;
598594
rkv = get_keyval(&curpos);
599595
if (rkv == NULL) {
600596
fprintf(stderr,"Token error at offset %ld\n",
601597
(long)(curpos - descriptor));
602-
fclose(outputf);
603-
return 2;
598+
ret = 2;
599+
goto cleanup;
604600
}
605601

606602
if (strcmp(rkv->key, "WRAP") == 0) {
607603
WRAP.item[WRAP.count++] = rkv;
604+
rkv_needs_free = false;
608605
only_ident = false;
609606
} else if (curlist == &base && strcmp(rkv->key, "NUMBER") == 0) {
610607
if (rkv->val[0] == '(') {
@@ -613,6 +610,7 @@ int main(int argc, char **argv)
613610
curlist = &base;
614611
} else {
615612
NUMBER.item[NUMBER.count++] = rkv;
613+
rkv_needs_free = false;
616614
}
617615
only_ident = false;
618616
} else if (strcmp(rkv->key, "IDENT") == 0) {
@@ -653,26 +651,30 @@ int main(int argc, char **argv)
653651
do_token_check = false;
654652
} else if (strcmp(rkv->key, "COLOR") == 0) {
655653
COLOR.item[COLOR.count++] = rkv;
654+
rkv_needs_free = false;
656655
do_token_check = false;
657656
only_ident = false;
658657
} else if (strcmp(rkv->key, "URI") == 0) {
659658
URI.item[URI.count++] = rkv;
659+
rkv_needs_free = false;
660660
only_ident = false;
661661
} else if (strcmp(rkv->key, "GENERIC") == 0) {
662662
is_generic = true;
663663
} else {
664664
/* just append to current list */
665665
curlist->item[curlist->count++] = rkv;
666+
rkv_needs_free = false;
666667
}
668+
if (rkv_needs_free)
669+
free(rkv);
667670
}
668671

669672
if (base.count != 1) {
670-
fprintf(stderr,"Incorrect base element count (got %d expected 1)\n", base.count);
671-
fclose(outputf);
672-
return 3;
673+
fprintf(stderr, "Incorrect base element count (got %d expected 1)\n", base.count);
674+
ret = 3;
675+
goto cleanup;
673676
}
674677

675-
676678
/* header */
677679
output_header(outputf, descriptor, base.item[0], is_generic);
678680

@@ -707,10 +709,28 @@ int main(int argc, char **argv)
707709
}
708710

709711
output_footer(outputf);
710-
711712
}
712713

713-
fclose(outputf);
714-
715-
return 0;
716-
}
714+
cleanup:
715+
/* Clean up allocated keyvals */
716+
for (int i = 0; i < base.count; i++) {
717+
free(base.item[i]);
718+
}
719+
for (int i = 0; i < IDENT.count; i++) {
720+
if (IDENT.item[i] != &ident_inherit && IDENT.item[i] != &ident_initial &&
721+
IDENT.item[i] != &ident_revert && IDENT.item[i] != &ident_unset) {
722+
free(IDENT.item[i]);
723+
}
724+
}
725+
for (int i = 0; i < URI.count; i++) free(URI.item[i]);
726+
for (int i = 0; i < WRAP.count; i++) free(WRAP.item[i]);
727+
for (int i = 0; i < NUMBER.count; i++) free(NUMBER.item[i]);
728+
for (int i = 0; i < COLOR.count; i++) free(COLOR.item[i]);
729+
for (int i = 0; i < LENGTH_UNIT.count; i++) free(LENGTH_UNIT.item[i]);
730+
for (int i = 0; i < IDENT_LIST.count; i++) free(IDENT_LIST.item[i]);
731+
for (int i = 0; i < CALC.count; i++) free(CALC.item[i]);
732+
free(descriptor);
733+
if (outputf != stdout) fclose(outputf);
734+
735+
return ret;
736+
}

0 commit comments

Comments
 (0)