Fossil SCM

Enhance blob_append_json_literal() so that it escapes all control characters.

drh 2021-09-11 19:20 trunk
Commit 810576be159c62d1db236bd11b74ab002328e3ba61ce94e18cebc59cabbfe60b
1 file changed +36 -10
+36 -10
--- src/blob.c
+++ src/blob.c
@@ -399,21 +399,47 @@
399399
void blob_append_json_literal(Blob *pOut, const char *z, int n){
400400
int i;
401401
blob_append_char(pOut, '"');
402402
for(i=0; i<n; i++){
403403
char c = z[i];
404
- char esc = 0;
405404
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
+ }
415441
blob_append_char(pOut, c);
416442
}
417443
blob_append_char(pOut, '"');
418444
}
419445
420446
--- 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

Keyboard Shortcuts

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