Fossil SCM
The Label list was not properly freed in some cases; looking at the annotate of 'win/Makefile.msc' was triggering the case.
Commit
4860d9f23481e46fb99d4e095105fca8905453fd
Parent
7870a89b103a37b…
1 file changed
+23
-2
+23
-2
| --- src/diff.c | ||
| +++ src/diff.c | ||
| @@ -717,14 +717,16 @@ | ||
| 717 | 717 | if( x->zSrc==0 || x->iLevel==iPrevLevel ){ |
| 718 | 718 | if (x->zSrc!=0) |
| 719 | 719 | { |
| 720 | 720 | if(--x->zSrc->nref == 0) |
| 721 | 721 | { |
| 722 | - free(x->zSrc->str); | |
| 722 | + free(x->zSrc->str); | |
| 723 | + if (x->zSrc->prev) | |
| 723 | 724 | x->zSrc->prev->next = x->zSrc->next; |
| 725 | + if (x->zSrc->next) | |
| 724 | 726 | x->zSrc->next->prev = x->zSrc->prev; |
| 725 | - free(x->zSrc); | |
| 727 | + free(x->zSrc); | |
| 726 | 728 | } |
| 727 | 729 | } |
| 728 | 730 | x->zSrc = zPName; |
| 729 | 731 | ++zPName->nref; |
| 730 | 732 | x->iLevel = iThisLevel; |
| @@ -850,10 +852,11 @@ | ||
| 850 | 852 | const char *zDate = db_column_text(&q, 2); |
| 851 | 853 | const char *zUser = db_column_text(&q, 3); |
| 852 | 854 | struct Label *l = fossil_malloc(sizeof(*l)); |
| 853 | 855 | l->nref = 0; |
| 854 | 856 | l->next = p->firstLabel; |
| 857 | + l->prev = 0; | |
| 855 | 858 | if (p->firstLabel) |
| 856 | 859 | p->firstLabel->prev = l; |
| 857 | 860 | if( webLabel ){ |
| 858 | 861 | l->str = mprintf( |
| 859 | 862 | "<a href='%s/info/%s' target='infowindow'>%.10s</a> %s %9.9s", |
| @@ -867,11 +870,17 @@ | ||
| 867 | 870 | p->azVers = fossil_realloc(p->azVers, p->nVers*sizeof(p->azVers[0]) ); |
| 868 | 871 | p->azVers[p->nVers-1] = l; |
| 869 | 872 | content_get(pid, &step); |
| 870 | 873 | annotation_step(p, &step, l); |
| 871 | 874 | if (l->nref == 0) |
| 875 | + { | |
| 872 | 876 | free(l->str); |
| 877 | + p->firstLabel = l->next; | |
| 878 | + if (l->next) | |
| 879 | + l->next->prev = 0; | |
| 880 | + free(l); | |
| 881 | + } | |
| 873 | 882 | blob_reset(&step); |
| 874 | 883 | } |
| 875 | 884 | db_finalize(&q); |
| 876 | 885 | free(p->c.aTo); |
| 877 | 886 | } |
| @@ -920,10 +929,22 @@ | ||
| 920 | 929 | ((char*)ann.aOrig[i].z)[ann.aOrig[i].n] = 0; |
| 921 | 930 | @ %s(ann.aOrig[i].zSrc->str): %h(ann.aOrig[i].z) |
| 922 | 931 | } |
| 923 | 932 | @ </pre> |
| 924 | 933 | style_footer(); |
| 934 | + | |
| 935 | + free(ann.azVers); | |
| 936 | + free(ann.aOrig); | |
| 937 | + blob_reset(&ann.toAnnotate); | |
| 938 | + while(ann.firstLabel) { | |
| 939 | + struct Label *l; | |
| 940 | + l = ann.firstLabel->next; | |
| 941 | + assert(ann.firstLabel->nref > 0); | |
| 942 | + free(ann.firstLabel->str); | |
| 943 | + free(ann.firstLabel); | |
| 944 | + ann.firstLabel = l; | |
| 945 | + } | |
| 925 | 946 | } |
| 926 | 947 | |
| 927 | 948 | /* |
| 928 | 949 | ** COMMAND: annotate |
| 929 | 950 | ** |
| 930 | 951 |
| --- src/diff.c | |
| +++ src/diff.c | |
| @@ -717,14 +717,16 @@ | |
| 717 | if( x->zSrc==0 || x->iLevel==iPrevLevel ){ |
| 718 | if (x->zSrc!=0) |
| 719 | { |
| 720 | if(--x->zSrc->nref == 0) |
| 721 | { |
| 722 | free(x->zSrc->str); |
| 723 | x->zSrc->prev->next = x->zSrc->next; |
| 724 | x->zSrc->next->prev = x->zSrc->prev; |
| 725 | free(x->zSrc); |
| 726 | } |
| 727 | } |
| 728 | x->zSrc = zPName; |
| 729 | ++zPName->nref; |
| 730 | x->iLevel = iThisLevel; |
| @@ -850,10 +852,11 @@ | |
| 850 | const char *zDate = db_column_text(&q, 2); |
| 851 | const char *zUser = db_column_text(&q, 3); |
| 852 | struct Label *l = fossil_malloc(sizeof(*l)); |
| 853 | l->nref = 0; |
| 854 | l->next = p->firstLabel; |
| 855 | if (p->firstLabel) |
| 856 | p->firstLabel->prev = l; |
| 857 | if( webLabel ){ |
| 858 | l->str = mprintf( |
| 859 | "<a href='%s/info/%s' target='infowindow'>%.10s</a> %s %9.9s", |
| @@ -867,11 +870,17 @@ | |
| 867 | p->azVers = fossil_realloc(p->azVers, p->nVers*sizeof(p->azVers[0]) ); |
| 868 | p->azVers[p->nVers-1] = l; |
| 869 | content_get(pid, &step); |
| 870 | annotation_step(p, &step, l); |
| 871 | if (l->nref == 0) |
| 872 | free(l->str); |
| 873 | blob_reset(&step); |
| 874 | } |
| 875 | db_finalize(&q); |
| 876 | free(p->c.aTo); |
| 877 | } |
| @@ -920,10 +929,22 @@ | |
| 920 | ((char*)ann.aOrig[i].z)[ann.aOrig[i].n] = 0; |
| 921 | @ %s(ann.aOrig[i].zSrc->str): %h(ann.aOrig[i].z) |
| 922 | } |
| 923 | @ </pre> |
| 924 | style_footer(); |
| 925 | } |
| 926 | |
| 927 | /* |
| 928 | ** COMMAND: annotate |
| 929 | ** |
| 930 |
| --- src/diff.c | |
| +++ src/diff.c | |
| @@ -717,14 +717,16 @@ | |
| 717 | if( x->zSrc==0 || x->iLevel==iPrevLevel ){ |
| 718 | if (x->zSrc!=0) |
| 719 | { |
| 720 | if(--x->zSrc->nref == 0) |
| 721 | { |
| 722 | free(x->zSrc->str); |
| 723 | if (x->zSrc->prev) |
| 724 | x->zSrc->prev->next = x->zSrc->next; |
| 725 | if (x->zSrc->next) |
| 726 | x->zSrc->next->prev = x->zSrc->prev; |
| 727 | free(x->zSrc); |
| 728 | } |
| 729 | } |
| 730 | x->zSrc = zPName; |
| 731 | ++zPName->nref; |
| 732 | x->iLevel = iThisLevel; |
| @@ -850,10 +852,11 @@ | |
| 852 | const char *zDate = db_column_text(&q, 2); |
| 853 | const char *zUser = db_column_text(&q, 3); |
| 854 | struct Label *l = fossil_malloc(sizeof(*l)); |
| 855 | l->nref = 0; |
| 856 | l->next = p->firstLabel; |
| 857 | l->prev = 0; |
| 858 | if (p->firstLabel) |
| 859 | p->firstLabel->prev = l; |
| 860 | if( webLabel ){ |
| 861 | l->str = mprintf( |
| 862 | "<a href='%s/info/%s' target='infowindow'>%.10s</a> %s %9.9s", |
| @@ -867,11 +870,17 @@ | |
| 870 | p->azVers = fossil_realloc(p->azVers, p->nVers*sizeof(p->azVers[0]) ); |
| 871 | p->azVers[p->nVers-1] = l; |
| 872 | content_get(pid, &step); |
| 873 | annotation_step(p, &step, l); |
| 874 | if (l->nref == 0) |
| 875 | { |
| 876 | free(l->str); |
| 877 | p->firstLabel = l->next; |
| 878 | if (l->next) |
| 879 | l->next->prev = 0; |
| 880 | free(l); |
| 881 | } |
| 882 | blob_reset(&step); |
| 883 | } |
| 884 | db_finalize(&q); |
| 885 | free(p->c.aTo); |
| 886 | } |
| @@ -920,10 +929,22 @@ | |
| 929 | ((char*)ann.aOrig[i].z)[ann.aOrig[i].n] = 0; |
| 930 | @ %s(ann.aOrig[i].zSrc->str): %h(ann.aOrig[i].z) |
| 931 | } |
| 932 | @ </pre> |
| 933 | style_footer(); |
| 934 | |
| 935 | free(ann.azVers); |
| 936 | free(ann.aOrig); |
| 937 | blob_reset(&ann.toAnnotate); |
| 938 | while(ann.firstLabel) { |
| 939 | struct Label *l; |
| 940 | l = ann.firstLabel->next; |
| 941 | assert(ann.firstLabel->nref > 0); |
| 942 | free(ann.firstLabel->str); |
| 943 | free(ann.firstLabel); |
| 944 | ann.firstLabel = l; |
| 945 | } |
| 946 | } |
| 947 | |
| 948 | /* |
| 949 | ** COMMAND: annotate |
| 950 | ** |
| 951 |