Ignore:
Timestamp:
06/18/11 14:28:43 (13 years ago)
Author:
r2d
Message:

patch by Markus Peloquin <markus@…> :
Fixed the copious memory leaks in libcuefile and changed the headers
so C++ could use it.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcuefile/trunk/src/cue_parse.c

    r416 r469  
    11841184  case 6:
    11851185#line 115 "cue_parse.y"
    1186     { cd_set_catalog(cd, yyvsp[-1].sval); }
     1186    { cd_set_catalog(cd, yyvsp[-1].sval); free(yyvsp[-1].sval); }
    11871187    break;
    11881188
    11891189  case 7:
    11901190#line 116 "cue_parse.y"
    1191     { /* ignored */ }
     1191    { free(yyvsp[-1].sval); /* ignored */ }
    11921192    break;
    11931193
     
    11991199                        free(new_filename);
    12001200                }
    1201                 new_filename = strdup(yyvsp[-2].sval);
     1201                new_filename = yyvsp[-2].sval; /*strdup(yyvsp[-2].sval);*/
    12021202        }
    12031203    break;
     
    12121212                cdtext = track_get_cdtext(track);
    12131213
    1214                 cur_filename = new_filename;
    1215                 if (NULL != cur_filename)
    1216                         prev_filename = cur_filename;
     1214                if (cur_filename) free(cur_filename);
     1215                cur_filename = new_filename ? strdup(new_filename) : 0;
     1216                if (NULL != cur_filename) {
     1217                        if (prev_filename) free(prev_filename);
     1218                        prev_filename = strdup(cur_filename);
     1219                }
    12171220
    12181221                if (NULL == prev_filename)
     
    12211224                        track_set_filename(track, prev_filename);
    12221225
     1226                if (new_filename) free(new_filename);
    12231227                new_filename = NULL;
    12241228        }
     
    12341238  case 34:
    12351239#line 195 "cue_parse.y"
    1236     { track_set_isrc(track, yyvsp[-1].sval); }
     1240    { track_set_isrc(track, yyvsp[-1].sval); free(yyvsp[-1].sval); }
    12371241    break;
    12381242
     
    12781282  case 46:
    12791283#line 235 "cue_parse.y"
    1280     { cdtext_set (yyvsp[-2].ival, yyvsp[-1].sval, cdtext); }
     1284    { cdtext_set (yyvsp[-2].ival, yyvsp[-1].sval, cdtext); free(yyvsp[-1].sval); }
    12811285    break;
    12821286
     
    15191523        yydebug = 0;
    15201524
    1521         if (0 == yyparse())
    1522                 return cd;
    1523 
    1524         return NULL;
     1525        int error = yyparse();
     1526        cue_delete_buffer();
     1527        if (prev_filename) {
     1528                free(prev_filename);
     1529                prev_filename = 0;
     1530        }
     1531        if (cur_filename) {
     1532                free(cur_filename);
     1533                cur_filename = 0;
     1534        }
     1535        if (new_filename) {
     1536                free(new_filename);
     1537                new_filename = 0;
     1538        }
     1539
     1540        Cd *res = cd;
     1541        if (error) {
     1542                cd_delete(cd);
     1543                res = 0;
     1544        }
     1545        cd = 0;
     1546        track = 0;
     1547        prev_track = 0;
     1548        cdtext = 0;
     1549        return res;
    15251550}
    15261551
Note: See TracChangeset for help on using the changeset viewer.