Fossil SCM

The Label list was not properly freed in some cases; looking at the annotate of 'win/Makefile.msc' was triggering the case.

viriketo 2011-09-13 17:18 UTC annotate_noleak
Commit 4860d9f23481e46fb99d4e095105fca8905453fd
1 file changed +23 -2
+23 -2
--- src/diff.c
+++ src/diff.c
@@ -717,14 +717,16 @@
717717
if( x->zSrc==0 || x->iLevel==iPrevLevel ){
718718
if (x->zSrc!=0)
719719
{
720720
if(--x->zSrc->nref == 0)
721721
{
722
- free(x->zSrc->str);
722
+ free(x->zSrc->str);
723
+ if (x->zSrc->prev)
723724
x->zSrc->prev->next = x->zSrc->next;
725
+ if (x->zSrc->next)
724726
x->zSrc->next->prev = x->zSrc->prev;
725
- free(x->zSrc);
727
+ free(x->zSrc);
726728
}
727729
}
728730
x->zSrc = zPName;
729731
++zPName->nref;
730732
x->iLevel = iThisLevel;
@@ -850,10 +852,11 @@
850852
const char *zDate = db_column_text(&q, 2);
851853
const char *zUser = db_column_text(&q, 3);
852854
struct Label *l = fossil_malloc(sizeof(*l));
853855
l->nref = 0;
854856
l->next = p->firstLabel;
857
+ l->prev = 0;
855858
if (p->firstLabel)
856859
p->firstLabel->prev = l;
857860
if( webLabel ){
858861
l->str = mprintf(
859862
"<a href='%s/info/%s' target='infowindow'>%.10s</a> %s %9.9s",
@@ -867,11 +870,17 @@
867870
p->azVers = fossil_realloc(p->azVers, p->nVers*sizeof(p->azVers[0]) );
868871
p->azVers[p->nVers-1] = l;
869872
content_get(pid, &step);
870873
annotation_step(p, &step, l);
871874
if (l->nref == 0)
875
+ {
872876
free(l->str);
877
+ p->firstLabel = l->next;
878
+ if (l->next)
879
+ l->next->prev = 0;
880
+ free(l);
881
+ }
873882
blob_reset(&step);
874883
}
875884
db_finalize(&q);
876885
free(p->c.aTo);
877886
}
@@ -920,10 +929,22 @@
920929
((char*)ann.aOrig[i].z)[ann.aOrig[i].n] = 0;
921930
@ %s(ann.aOrig[i].zSrc->str): %h(ann.aOrig[i].z)
922931
}
923932
@ </pre>
924933
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
+ }
925946
}
926947
927948
/*
928949
** COMMAND: annotate
929950
**
930951
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button