aboutsummaryrefslogtreecommitdiff
path: root/src/json.c
diff options
context:
space:
mode:
authordrh <>2023-12-12 14:33:52 +0000
committerdrh <>2023-12-12 14:33:52 +0000
commit87399a56db384f4ebf188652132ef0f29cd57b75 (patch)
tree7f3623470d87333aa074249fe0f233f5baeeefe4 /src/json.c
parentcc1a39fd247cf90af0ae59304206faf7ecb61819 (diff)
downloadsqlite-87399a56db384f4ebf188652132ef0f29cd57b75.tar.gz
sqlite-87399a56db384f4ebf188652132ef0f29cd57b75.zip
Improvements to JSONB validation - catch more cases where the input does
not conform to spec. FossilOrigin-Name: be1864eac4eb75cc30bf98f73092c8608467f4bd956240df6a0cbea9f1e09e85
Diffstat (limited to 'src/json.c')
-rw-r--r--src/json.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/json.c b/src/json.c
index 17ebc769c..5487f0402 100644
--- a/src/json.c
+++ b/src/json.c
@@ -1265,9 +1265,6 @@ static u32 jsonbValidityCheck(
case JSONB_FALSE: {
return n+sz==1 ? 0 : i+1;
}
- default: {
- return i+1;
- }
case JSONB_INT: {
if( sz<1 ) return i+1;
j = i+n;
@@ -1316,6 +1313,7 @@ static u32 jsonbValidityCheck(
if( sz<3 ) return i+1;
}
if( z[j]=='.' ){
+ if( x==JSONB_FLOAT ) return j+1;
if( !sqlite3Isdigit(z[j+1]) ) return j+1;
j += 2;
seen = 1;
@@ -1327,7 +1325,7 @@ static u32 jsonbValidityCheck(
for(; j<k; j++){
if( sqlite3Isdigit(z[j]) ) continue;
if( z[j]=='.' ){
- if( seen>0 ) return i+1;
+ if( seen>0 ) return j+1;
if( x==JSONB_FLOAT && (j==k-1 || !sqlite3Isdigit(z[j+1])) ){
return j+1;
}
@@ -1346,6 +1344,7 @@ static u32 jsonbValidityCheck(
}
return j+1;
}
+ if( seen==0 ) return i+1;
return 0;
}
case JSONB_TEXT: {
@@ -1429,6 +1428,9 @@ static u32 jsonbValidityCheck(
if( (cnt & 1)!=0 ) return j+1;
return 0;
}
+ default: {
+ return i+1;
+ }
}
}
@@ -4234,7 +4236,7 @@ static void jsonErrorFunc(
if( jsonFuncArgMightBeBinary(argv[0]) ){
s.aBlob = (u8*)sqlite3_value_blob(argv[0]);
s.nBlob = sqlite3_value_bytes(argv[0]);
- iErrPos = (i64)jsonbValidityCheck(&s, 0, s.nBlob, 0);
+ iErrPos = (i64)jsonbValidityCheck(&s, 0, s.nBlob, 1);
}else{
s.zJson = (char*)sqlite3_value_text(argv[0]);
if( s.zJson==0 ) return; /* NULL input or OOM */