aboutsummaryrefslogtreecommitdiff
path: root/src/json.c
diff options
context:
space:
mode:
authordrh <>2023-10-06 15:35:42 +0000
committerdrh <>2023-10-06 15:35:42 +0000
commit98dbfa69d3c17c1d2e742e37a730679ec51a26be (patch)
tree32eac5e4f26e7a4f11858c1d47af70eec79eb98c /src/json.c
parente690d5ad80ae90573fce913b0c01d05aaac0c769 (diff)
downloadsqlite-98dbfa69d3c17c1d2e742e37a730679ec51a26be.tar.gz
sqlite-98dbfa69d3c17c1d2e742e37a730679ec51a26be.zip
Fixes to rendering JSON5 extensions encoded as JSONB.
FossilOrigin-Name: 5a17e4479aad2d8313170e5de83a1c52f30b55d9d4fb776024fa6622e175c63b
Diffstat (limited to 'src/json.c')
-rw-r--r--src/json.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/json.c b/src/json.c
index b2053af9e..25ef372d8 100644
--- a/src/json.c
+++ b/src/json.c
@@ -3308,15 +3308,16 @@ static u32 jsonRenderBlob(
case JSONB_TEXT5: {
const char *zIn;
u32 k;
+ u32 sz2 = sz;
zIn = (const char*)&pParse->aBlob[i+n];
jsonAppendChar(pOut, '"');
- while( sz>0 ){
- for(k=0; k<sz && zIn[k]!='\\'; k++){}
+ while( sz2>0 ){
+ for(k=0; k<sz2 && zIn[k]!='\\'; k++){}
if( k>0 ){
jsonAppendRawNZ(pOut, zIn, k);
zIn += k;
- sz -= k;
- if( sz==0 ) break;
+ sz2 -= k;
+ if( sz2==0 ) break;
}
assert( zIn[0]=='\\' );
switch( (u8)zIn[1] ){
@@ -3330,7 +3331,7 @@ static u32 jsonRenderBlob(
jsonAppendRawNZ(pOut, "\\u00", 4);
jsonAppendRawNZ(pOut, &zIn[2], 2);
zIn += 2;
- sz -= 2;
+ sz2 -= 2;
break;
case '0':
jsonAppendRawNZ(pOut, "\\u0000", 6);
@@ -3338,24 +3339,24 @@ static u32 jsonRenderBlob(
case '\r':
if( zIn[2]=='\n' ){
zIn++;
- sz--;
+ sz2--;
}
break;
case '\n':
break;
case 0xe2:
- assert( sz>=4 );
+ assert( sz2>=4 );
assert( 0x80==(u8)zIn[2] );
assert( 0xa8==(u8)zIn[3] || 0xa9==(u8)zIn[3] );
zIn += 2;
- sz -= 2;
+ sz2 -= 2;
break;
default:
jsonAppendRawNZ(pOut, zIn, 2);
break;
}
zIn += 2;
- sz -= 2;
+ sz2 -= 2;
}
jsonAppendChar(pOut, '"');
break;
@@ -3387,6 +3388,7 @@ static u32 jsonRenderBlob(
}
default: {
+ pOut->eErr |= JSTRING_MALFORMED;
break;
}
}