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.

drh 2020-06-01 16:10 trunk
Commit bc2e6fbeb5f3c3ca224f278dd43f4a01039edfb1ae34a96cb77e46bb5ab55dc8
1 file changed +9 -2
--- src/wikiformat.c
+++ src/wikiformat.c
@@ -2463,11 +2463,15 @@
24632463
** routine is a no-op.
24642464
*/
24652465
void html_tagstack_pop(HtmlTagStack *p, Blob *pBlob, int eEnd){
24662466
int i;
24672467
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'>&lt;/%s&gt;</span>",
2470
+ aMarkup[eEnd].zName);
2471
+ return;
2472
+ }
24692473
do{
24702474
p->n--;
24712475
blob_appendf(pBlob, "</%s>", aMarkup[eEnd].zName);
24722476
}while( p->aStack[p->n]!=eEnd );
24732477
}
@@ -2521,11 +2525,14 @@
25212525
continue;
25222526
}else{
25232527
i = j + n;
25242528
}
25252529
parseMarkup(&markup, zHtml+j);
2526
- if( markup.iCode!=MARKUP_INVALID ){
2530
+ if( markup.iCode==MARKUP_INVALID ){
2531
+ blob_appendf(pBlob, "<span class='error'>&lt;%.*s&gt;</span>",
2532
+ n-2, zHtml+j+1);
2533
+ }else{
25272534
if( markup.endTag ){
25282535
html_tagstack_pop(&s, pBlob, markup.iCode);
25292536
}else{
25302537
renderMarkup(pBlob, &markup);
25312538
if( markup.iType!=MUTYPE_SINGLE ){
25322539
--- 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'>&lt;/%s&gt;</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'>&lt;%.*s&gt;</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

Keyboard Shortcuts

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