Fossil SCM
Enhance blob_append_json_literal() so that it escapes all control characters.
Commit
810576be159c62d1db236bd11b74ab002328e3ba61ce94e18cebc59cabbfe60b
Parent
0f7740b6329e533…
1 file changed
+36
-10
+36
-10
| --- src/blob.c | ||
| +++ src/blob.c | ||
| @@ -399,21 +399,47 @@ | ||
| 399 | 399 | void blob_append_json_literal(Blob *pOut, const char *z, int n){ |
| 400 | 400 | int i; |
| 401 | 401 | blob_append_char(pOut, '"'); |
| 402 | 402 | for(i=0; i<n; i++){ |
| 403 | 403 | char c = z[i]; |
| 404 | - char esc = 0; | |
| 405 | 404 | switch( c ){ |
| 406 | - case '\t': c = 't'; | |
| 407 | - case '"': | |
| 408 | - case '\\': | |
| 409 | - esc = 1; | |
| 410 | - break; | |
| 411 | - case '\r': c = 'r'; esc = 1; break; | |
| 412 | - case '\n': c = 'n'; esc = 1; break; | |
| 413 | - } | |
| 414 | - if(esc) blob_append_char(pOut, '\\'); | |
| 405 | + case 0x00: | |
| 406 | + case 0x01: | |
| 407 | + case 0x02: | |
| 408 | + case 0x03: | |
| 409 | + case 0x04: | |
| 410 | + case 0x05: | |
| 411 | + case 0x06: | |
| 412 | + case 0x07: c += '0' - 0x00; blob_append(pOut, "\\u000",5); break; | |
| 413 | + case 0x0b: | |
| 414 | + case 0x0e: | |
| 415 | + case 0x0f: c += 'a' - 0x0a; blob_append(pOut, "\\u000",5); break; | |
| 416 | + case 0x10: | |
| 417 | + case 0x11: | |
| 418 | + case 0x12: | |
| 419 | + case 0x13: | |
| 420 | + case 0x14: | |
| 421 | + case 0x15: | |
| 422 | + case 0x16: | |
| 423 | + case 0x17: | |
| 424 | + case 0x18: | |
| 425 | + case 0x19: c += '0' - 0x10; blob_append(pOut, "\\u001",5); break; | |
| 426 | + case 0x1a: | |
| 427 | + case 0x1b: | |
| 428 | + case 0x1c: | |
| 429 | + case 0x1d: | |
| 430 | + case 0x1e: | |
| 431 | + case 0x1f: c += 'a' - 0x1a; blob_append(pOut, "\\u001",5); break; | |
| 432 | + case '\b': c = 'b'; blob_append_char(pOut, '\\'); break; | |
| 433 | + case '\t': c = 't'; blob_append_char(pOut, '\\'); break; | |
| 434 | + case '\r': c = 'r'; blob_append_char(pOut, '\\'); break; | |
| 435 | + case '\n': c = 'n'; blob_append_char(pOut, '\\'); break; | |
| 436 | + case '\f': c = 'f'; blob_append_char(pOut, '\\'); break; | |
| 437 | + case '"': blob_append_char(pOut, '\\'); break; | |
| 438 | + case '\\': blob_append_char(pOut, '\\'); break; | |
| 439 | + default: break; | |
| 440 | + } | |
| 415 | 441 | blob_append_char(pOut, c); |
| 416 | 442 | } |
| 417 | 443 | blob_append_char(pOut, '"'); |
| 418 | 444 | } |
| 419 | 445 | |
| 420 | 446 |
| --- src/blob.c | |
| +++ src/blob.c | |
| @@ -399,21 +399,47 @@ | |
| 399 | void blob_append_json_literal(Blob *pOut, const char *z, int n){ |
| 400 | int i; |
| 401 | blob_append_char(pOut, '"'); |
| 402 | for(i=0; i<n; i++){ |
| 403 | char c = z[i]; |
| 404 | char esc = 0; |
| 405 | switch( c ){ |
| 406 | case '\t': c = 't'; |
| 407 | case '"': |
| 408 | case '\\': |
| 409 | esc = 1; |
| 410 | break; |
| 411 | case '\r': c = 'r'; esc = 1; break; |
| 412 | case '\n': c = 'n'; esc = 1; break; |
| 413 | } |
| 414 | if(esc) blob_append_char(pOut, '\\'); |
| 415 | blob_append_char(pOut, c); |
| 416 | } |
| 417 | blob_append_char(pOut, '"'); |
| 418 | } |
| 419 | |
| 420 |
| --- src/blob.c | |
| +++ src/blob.c | |
| @@ -399,21 +399,47 @@ | |
| 399 | void blob_append_json_literal(Blob *pOut, const char *z, int n){ |
| 400 | int i; |
| 401 | blob_append_char(pOut, '"'); |
| 402 | for(i=0; i<n; i++){ |
| 403 | char c = z[i]; |
| 404 | switch( c ){ |
| 405 | case 0x00: |
| 406 | case 0x01: |
| 407 | case 0x02: |
| 408 | case 0x03: |
| 409 | case 0x04: |
| 410 | case 0x05: |
| 411 | case 0x06: |
| 412 | case 0x07: c += '0' - 0x00; blob_append(pOut, "\\u000",5); break; |
| 413 | case 0x0b: |
| 414 | case 0x0e: |
| 415 | case 0x0f: c += 'a' - 0x0a; blob_append(pOut, "\\u000",5); break; |
| 416 | case 0x10: |
| 417 | case 0x11: |
| 418 | case 0x12: |
| 419 | case 0x13: |
| 420 | case 0x14: |
| 421 | case 0x15: |
| 422 | case 0x16: |
| 423 | case 0x17: |
| 424 | case 0x18: |
| 425 | case 0x19: c += '0' - 0x10; blob_append(pOut, "\\u001",5); break; |
| 426 | case 0x1a: |
| 427 | case 0x1b: |
| 428 | case 0x1c: |
| 429 | case 0x1d: |
| 430 | case 0x1e: |
| 431 | case 0x1f: c += 'a' - 0x1a; blob_append(pOut, "\\u001",5); break; |
| 432 | case '\b': c = 'b'; blob_append_char(pOut, '\\'); break; |
| 433 | case '\t': c = 't'; blob_append_char(pOut, '\\'); break; |
| 434 | case '\r': c = 'r'; blob_append_char(pOut, '\\'); break; |
| 435 | case '\n': c = 'n'; blob_append_char(pOut, '\\'); break; |
| 436 | case '\f': c = 'f'; blob_append_char(pOut, '\\'); break; |
| 437 | case '"': blob_append_char(pOut, '\\'); break; |
| 438 | case '\\': blob_append_char(pOut, '\\'); break; |
| 439 | default: break; |
| 440 | } |
| 441 | blob_append_char(pOut, c); |
| 442 | } |
| 443 | blob_append_char(pOut, '"'); |
| 444 | } |
| 445 | |
| 446 |