Ticket #49030: patch-rcsparse_c.diff

File patch-rcsparse_c.diff, 1.8 KB (added by jpo@…, 9 years ago)
  • rcsparse.c

    $OpenBSD: patch-rcsparse_c,v 1.1 2013/05/15 20:17:54 dcoppa Exp $
    
    Free the fulltext of unmatched revisions while searching for the
    requested revision to avoid exhausting all available memory during
    the search.
    See: https://github.com/ustuehler/git-cvs/commit/b9fb06697901177ffff554ce692bf829ed6b6b79
    
    old new rcscheckout(struct rcsfile *rcs, const char *revstr, s 
    937937{
    938938        struct rcsrev searchrev;
    939939        struct rcstoken searchtok;
    940         struct rcsrev *currcsrev;
     940        struct rcsrev *currcsrev, *curtextrev;
    941941        struct stringinfo *curtext;
    942942        struct rcstoken *nextrev;
    943943        char *branchrev, *tmpstr;
    rcscheckout(struct rcsfile *rcs, const char *revstr, s 
    946946        if (rcsparsetree(rcs) < 0)
    947947                return NULL;
    948948
     949        curtextrev = NULL;
    949950        curtext = NULL;
    950951        nextrev = NULL;
    951952        branchrev = NULL;
    rcscheckout(struct rcsfile *rcs, const char *revstr, s 
    986987
    987988                if (curtext == NULL) {
    988989                        curtext = currcsrev->rawtext;
     990                        curtextrev = currcsrev;
    989991                } else {
    990992                        if (nextrev == NULL)
    991993                                goto fail;
    rcscheckout(struct rcsfile *rcs, const char *revstr, s 
    995997
    996998                        if (currcsrev->text) {
    997999                                /* Was expanded before */
     1000                                if (curtextrev != NULL) {
     1001                                        free(curtextrev->text);
     1002                                        curtextrev->text = NULL;
     1003                                }
    9981004                                curtext = currcsrev->text;
     1005                                curtextrev = currcsrev;
    9991006                        } else {
    10001007                                if (currcsrev->rawtext == NULL)
    10011008                                        goto fail;
    rcscheckout(struct rcsfile *rcs, const char *revstr, s 
    10041011                                        goto fail;
    10051012                                if (applydelta(&currcsrev->text, currcsrev->rawtext) < 0)
    10061013                                        goto fail;
    1007                                 free(currcsrev->rawtext);
    1008                                 currcsrev->rawtext = NULL;
     1014                                if (curtextrev != NULL) {
     1015                                        free(curtextrev->text);
     1016                                        curtextrev->text = NULL;
     1017                                }
    10091018                                curtext = currcsrev->text;
     1019                                curtextrev = currcsrev;
    10101020                        }
    10111021                }
    10121022