diff options
author | drh <> | 2023-10-06 15:35:42 +0000 |
---|---|---|
committer | drh <> | 2023-10-06 15:35:42 +0000 |
commit | 98dbfa69d3c17c1d2e742e37a730679ec51a26be (patch) | |
tree | 32eac5e4f26e7a4f11858c1d47af70eec79eb98c /src/json.c | |
parent | e690d5ad80ae90573fce913b0c01d05aaac0c769 (diff) | |
download | sqlite-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.c | 20 |
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; } } |