@@ -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