Fossil SCM
When HTML markup is sanitized by the blob_append_safe_html() function, instead of removing offending markup, escape it and put it within an error span.
Commit
bc2e6fbeb5f3c3ca224f278dd43f4a01039edfb1ae34a96cb77e46bb5ab55dc8
Parent
aadf91723adc8df…
1 file changed
+9
-2
+9
-2
| --- src/wikiformat.c | ||
| +++ src/wikiformat.c | ||
| @@ -2463,11 +2463,15 @@ | ||
| 2463 | 2463 | ** routine is a no-op. |
| 2464 | 2464 | */ |
| 2465 | 2465 | void html_tagstack_pop(HtmlTagStack *p, Blob *pBlob, int eEnd){ |
| 2466 | 2466 | int i; |
| 2467 | 2467 | for(i=p->n-1; i>=0 && p->aStack[i]!=eEnd; i--){} |
| 2468 | - if( i<0 ) return; | |
| 2468 | + if( i<0 ){ | |
| 2469 | + blob_appendf(pBlob, "<span class='error'></%s></span>", | |
| 2470 | + aMarkup[eEnd].zName); | |
| 2471 | + return; | |
| 2472 | + } | |
| 2469 | 2473 | do{ |
| 2470 | 2474 | p->n--; |
| 2471 | 2475 | blob_appendf(pBlob, "</%s>", aMarkup[eEnd].zName); |
| 2472 | 2476 | }while( p->aStack[p->n]!=eEnd ); |
| 2473 | 2477 | } |
| @@ -2521,11 +2525,14 @@ | ||
| 2521 | 2525 | continue; |
| 2522 | 2526 | }else{ |
| 2523 | 2527 | i = j + n; |
| 2524 | 2528 | } |
| 2525 | 2529 | parseMarkup(&markup, zHtml+j); |
| 2526 | - if( markup.iCode!=MARKUP_INVALID ){ | |
| 2530 | + if( markup.iCode==MARKUP_INVALID ){ | |
| 2531 | + blob_appendf(pBlob, "<span class='error'><%.*s></span>", | |
| 2532 | + n-2, zHtml+j+1); | |
| 2533 | + }else{ | |
| 2527 | 2534 | if( markup.endTag ){ |
| 2528 | 2535 | html_tagstack_pop(&s, pBlob, markup.iCode); |
| 2529 | 2536 | }else{ |
| 2530 | 2537 | renderMarkup(pBlob, &markup); |
| 2531 | 2538 | if( markup.iType!=MUTYPE_SINGLE ){ |
| 2532 | 2539 |
| --- src/wikiformat.c | |
| +++ src/wikiformat.c | |
| @@ -2463,11 +2463,15 @@ | |
| 2463 | ** routine is a no-op. |
| 2464 | */ |
| 2465 | void html_tagstack_pop(HtmlTagStack *p, Blob *pBlob, int eEnd){ |
| 2466 | int i; |
| 2467 | for(i=p->n-1; i>=0 && p->aStack[i]!=eEnd; i--){} |
| 2468 | if( i<0 ) return; |
| 2469 | do{ |
| 2470 | p->n--; |
| 2471 | blob_appendf(pBlob, "</%s>", aMarkup[eEnd].zName); |
| 2472 | }while( p->aStack[p->n]!=eEnd ); |
| 2473 | } |
| @@ -2521,11 +2525,14 @@ | |
| 2521 | continue; |
| 2522 | }else{ |
| 2523 | i = j + n; |
| 2524 | } |
| 2525 | parseMarkup(&markup, zHtml+j); |
| 2526 | if( markup.iCode!=MARKUP_INVALID ){ |
| 2527 | if( markup.endTag ){ |
| 2528 | html_tagstack_pop(&s, pBlob, markup.iCode); |
| 2529 | }else{ |
| 2530 | renderMarkup(pBlob, &markup); |
| 2531 | if( markup.iType!=MUTYPE_SINGLE ){ |
| 2532 |
| --- src/wikiformat.c | |
| +++ src/wikiformat.c | |
| @@ -2463,11 +2463,15 @@ | |
| 2463 | ** routine is a no-op. |
| 2464 | */ |
| 2465 | void html_tagstack_pop(HtmlTagStack *p, Blob *pBlob, int eEnd){ |
| 2466 | int i; |
| 2467 | for(i=p->n-1; i>=0 && p->aStack[i]!=eEnd; i--){} |
| 2468 | if( i<0 ){ |
| 2469 | blob_appendf(pBlob, "<span class='error'></%s></span>", |
| 2470 | aMarkup[eEnd].zName); |
| 2471 | return; |
| 2472 | } |
| 2473 | do{ |
| 2474 | p->n--; |
| 2475 | blob_appendf(pBlob, "</%s>", aMarkup[eEnd].zName); |
| 2476 | }while( p->aStack[p->n]!=eEnd ); |
| 2477 | } |
| @@ -2521,11 +2525,14 @@ | |
| 2525 | continue; |
| 2526 | }else{ |
| 2527 | i = j + n; |
| 2528 | } |
| 2529 | parseMarkup(&markup, zHtml+j); |
| 2530 | if( markup.iCode==MARKUP_INVALID ){ |
| 2531 | blob_appendf(pBlob, "<span class='error'><%.*s></span>", |
| 2532 | n-2, zHtml+j+1); |
| 2533 | }else{ |
| 2534 | if( markup.endTag ){ |
| 2535 | html_tagstack_pop(&s, pBlob, markup.iCode); |
| 2536 | }else{ |
| 2537 | renderMarkup(pBlob, &markup); |
| 2538 | if( markup.iType!=MUTYPE_SINGLE ){ |
| 2539 |