Fossil SCM

Bug fix in wiki rendering. Avoid terminating the output when an an unrecognized markup attribute appears inside <verbatim>.

drh 2008-06-08 16:19 trunk
Commit 71104b898d05fe56419b9a600febe0cacca8a570
1 file changed +8 -4
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -623,17 +623,19 @@
623623
p->iCode = findTag(zTag);
624624
p->iType = aMarkup[p->iCode].iType;
625625
p->nAttr = 0;
626626
while( isspace(z[i]) ){ i++; }
627627
while( p->nAttr<8 && isalpha(z[i]) ){
628
+ int attrOk; /* True to preserver attribute. False to ignore it */
628629
j = 0;
629630
while( isalnum(z[i]) ){
630631
if( j<sizeof(zTag)-1 ) zTag[j++] = tolower(z[i]);
631632
i++;
632633
}
633634
zTag[j] = 0;
634635
p->aAttr[p->nAttr].iCode = iCode = findAttr(zTag);
636
+ attrOk = iCode!=0 && (seen & aAttribute[iCode].iMask)==0;
635637
while( isspace(z[i]) ){ z++; }
636638
if( z[i]!='=' ){
637639
p->aAttr[p->nAttr].zValue = 0;
638640
p->aAttr[p->nAttr].cTerm = 0;
639641
c = 0;
@@ -646,16 +648,18 @@
646648
while( z[i] && z[i]!='"' ){ i++; }
647649
}else{
648650
zValue = &z[i];
649651
while( !isspace(z[i]) && z[i]!='>' ){ z++; }
650652
}
651
- p->aAttr[p->nAttr].zValue = zValue;
652
- p->aAttr[p->nAttr].cTerm = c = z[i];
653
- z[i] = 0;
653
+ if( attrOk ){
654
+ p->aAttr[p->nAttr].zValue = zValue;
655
+ p->aAttr[p->nAttr].cTerm = c = z[i];
656
+ z[i] = 0;
657
+ }
654658
i++;
655659
}
656
- if( iCode!=0 && (seen & aAttribute[iCode].iMask)==0 ){
660
+ if( attrOk ){
657661
seen |= aAttribute[iCode].iMask;
658662
p->nAttr++;
659663
}
660664
while( isspace(z[i]) ){ i++; }
661665
if( z[i]=='>' || (z[i]=='/' && z[i+1]=='>') ) break;
662666
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -623,17 +623,19 @@
623 p->iCode = findTag(zTag);
624 p->iType = aMarkup[p->iCode].iType;
625 p->nAttr = 0;
626 while( isspace(z[i]) ){ i++; }
627 while( p->nAttr<8 && isalpha(z[i]) ){
 
628 j = 0;
629 while( isalnum(z[i]) ){
630 if( j<sizeof(zTag)-1 ) zTag[j++] = tolower(z[i]);
631 i++;
632 }
633 zTag[j] = 0;
634 p->aAttr[p->nAttr].iCode = iCode = findAttr(zTag);
 
635 while( isspace(z[i]) ){ z++; }
636 if( z[i]!='=' ){
637 p->aAttr[p->nAttr].zValue = 0;
638 p->aAttr[p->nAttr].cTerm = 0;
639 c = 0;
@@ -646,16 +648,18 @@
646 while( z[i] && z[i]!='"' ){ i++; }
647 }else{
648 zValue = &z[i];
649 while( !isspace(z[i]) && z[i]!='>' ){ z++; }
650 }
651 p->aAttr[p->nAttr].zValue = zValue;
652 p->aAttr[p->nAttr].cTerm = c = z[i];
653 z[i] = 0;
 
 
654 i++;
655 }
656 if( iCode!=0 && (seen & aAttribute[iCode].iMask)==0 ){
657 seen |= aAttribute[iCode].iMask;
658 p->nAttr++;
659 }
660 while( isspace(z[i]) ){ i++; }
661 if( z[i]=='>' || (z[i]=='/' && z[i+1]=='>') ) break;
662
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -623,17 +623,19 @@
623 p->iCode = findTag(zTag);
624 p->iType = aMarkup[p->iCode].iType;
625 p->nAttr = 0;
626 while( isspace(z[i]) ){ i++; }
627 while( p->nAttr<8 && isalpha(z[i]) ){
628 int attrOk; /* True to preserver attribute. False to ignore it */
629 j = 0;
630 while( isalnum(z[i]) ){
631 if( j<sizeof(zTag)-1 ) zTag[j++] = tolower(z[i]);
632 i++;
633 }
634 zTag[j] = 0;
635 p->aAttr[p->nAttr].iCode = iCode = findAttr(zTag);
636 attrOk = iCode!=0 && (seen & aAttribute[iCode].iMask)==0;
637 while( isspace(z[i]) ){ z++; }
638 if( z[i]!='=' ){
639 p->aAttr[p->nAttr].zValue = 0;
640 p->aAttr[p->nAttr].cTerm = 0;
641 c = 0;
@@ -646,16 +648,18 @@
648 while( z[i] && z[i]!='"' ){ i++; }
649 }else{
650 zValue = &z[i];
651 while( !isspace(z[i]) && z[i]!='>' ){ z++; }
652 }
653 if( attrOk ){
654 p->aAttr[p->nAttr].zValue = zValue;
655 p->aAttr[p->nAttr].cTerm = c = z[i];
656 z[i] = 0;
657 }
658 i++;
659 }
660 if( attrOk ){
661 seen |= aAttribute[iCode].iMask;
662 p->nAttr++;
663 }
664 while( isspace(z[i]) ){ i++; }
665 if( z[i]=='>' || (z[i]=='/' && z[i+1]=='>') ) break;
666

Keyboard Shortcuts

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