aboutsummaryrefslogtreecommitdiff
path: root/src/json.c
diff options
context:
space:
mode:
authordrh <>2023-10-10 18:42:08 +0000
committerdrh <>2023-10-10 18:42:08 +0000
commit59ded6b5f112793ff67957b731ab26e2eefa6dd8 (patch)
tree0356c259a8fb1638499a348946ac68b5925665c4 /src/json.c
parentd88f378c7d316a9523485504b31705ca1040e2fe (diff)
downloadsqlite-59ded6b5f112793ff67957b731ab26e2eefa6dd8.tar.gz
sqlite-59ded6b5f112793ff67957b731ab26e2eefa6dd8.zip
Improved robustness when translating corrupt JSONB into JSON text.
FossilOrigin-Name: 0caa320d9099adbaf98e3719003dbdc4d158abcb3d8a1af20fbcd4c08c970f4a
Diffstat (limited to 'src/json.c')
-rw-r--r--src/json.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/json.c b/src/json.c
index 2d68aef11..a8f0049e7 100644
--- a/src/json.c
+++ b/src/json.c
@@ -3353,7 +3353,10 @@ static u32 jsonXlateBlobToText(
for(k=0; k<sz2 && zIn[k]!='\\'; k++){}
if( k>0 ){
jsonAppendRawNZ(pOut, zIn, k);
- if( sz2<=k ) break;
+ if( sz2<=k ){
+ pOut->eErr |= JSTRING_MALFORMED;
+ break;
+ }
zIn += k;
sz2 -= k;
}
@@ -3369,6 +3372,7 @@ static u32 jsonXlateBlobToText(
jsonAppendRawNZ(pOut, "\\u00", 4);
jsonAppendRawNZ(pOut, &zIn[2], 2);
if( sz2<2 ){
+ pOut->eErr |= JSTRING_MALFORMED;
sz2 = 0;
}else{
zIn += 2;
@@ -3387,9 +3391,14 @@ static u32 jsonXlateBlobToText(
case '\n':
break;
case 0xe2:
- assert( sz2>=4 );
- assert( 0x80==(u8)zIn[2] );
- assert( 0xa8==(u8)zIn[3] || 0xa9==(u8)zIn[3] );
+ if( sz2<4
+ || 0x80!=(u8)zIn[2]
+ || (0xa8!=(u8)zIn[3] && 0xa9!=(u8)zIn[3])
+ ){
+ pOut->eErr |= JSTRING_MALFORMED;
+ k = sz2;
+ break;
+ }
zIn += 2;
sz2 -= 2;
break;
@@ -3397,7 +3406,10 @@ static u32 jsonXlateBlobToText(
jsonAppendRawNZ(pOut, zIn, 2);
break;
}
- if( sz2<2 ) break;
+ if( sz2<2 ){
+ pOut->eErr |= JSTRING_MALFORMED;
+ break;
+ }
zIn += 2;
sz2 -= 2;
}