Fossil SCM
Bug fix in wiki rendering. Avoid terminating the output when an an unrecognized markup attribute appears inside <verbatim>.
Commit
71104b898d05fe56419b9a600febe0cacca8a570
Parent
dcc48662f838417…
1 file changed
+8
-4
+8
-4
| --- src/wikiformat.c | ||
| +++ src/wikiformat.c | ||
| @@ -623,17 +623,19 @@ | ||
| 623 | 623 | p->iCode = findTag(zTag); |
| 624 | 624 | p->iType = aMarkup[p->iCode].iType; |
| 625 | 625 | p->nAttr = 0; |
| 626 | 626 | while( isspace(z[i]) ){ i++; } |
| 627 | 627 | while( p->nAttr<8 && isalpha(z[i]) ){ |
| 628 | + int attrOk; /* True to preserver attribute. False to ignore it */ | |
| 628 | 629 | j = 0; |
| 629 | 630 | while( isalnum(z[i]) ){ |
| 630 | 631 | if( j<sizeof(zTag)-1 ) zTag[j++] = tolower(z[i]); |
| 631 | 632 | i++; |
| 632 | 633 | } |
| 633 | 634 | zTag[j] = 0; |
| 634 | 635 | p->aAttr[p->nAttr].iCode = iCode = findAttr(zTag); |
| 636 | + attrOk = iCode!=0 && (seen & aAttribute[iCode].iMask)==0; | |
| 635 | 637 | while( isspace(z[i]) ){ z++; } |
| 636 | 638 | if( z[i]!='=' ){ |
| 637 | 639 | p->aAttr[p->nAttr].zValue = 0; |
| 638 | 640 | p->aAttr[p->nAttr].cTerm = 0; |
| 639 | 641 | c = 0; |
| @@ -646,16 +648,18 @@ | ||
| 646 | 648 | while( z[i] && z[i]!='"' ){ i++; } |
| 647 | 649 | }else{ |
| 648 | 650 | zValue = &z[i]; |
| 649 | 651 | while( !isspace(z[i]) && z[i]!='>' ){ z++; } |
| 650 | 652 | } |
| 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 | + } | |
| 654 | 658 | i++; |
| 655 | 659 | } |
| 656 | - if( iCode!=0 && (seen & aAttribute[iCode].iMask)==0 ){ | |
| 660 | + if( attrOk ){ | |
| 657 | 661 | seen |= aAttribute[iCode].iMask; |
| 658 | 662 | p->nAttr++; |
| 659 | 663 | } |
| 660 | 664 | while( isspace(z[i]) ){ i++; } |
| 661 | 665 | if( z[i]=='>' || (z[i]=='/' && z[i+1]=='>') ) break; |
| 662 | 666 |
| --- 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 |