1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-09 14:21:03 +03:00

Improvements to JSONB validation - catch more cases where the input does

not conform to spec.

FossilOrigin-Name: be1864eac4eb75cc30bf98f73092c8608467f4bd956240df6a0cbea9f1e09e85
This commit is contained in:
drh
2023-12-12 14:33:52 +00:00
parent cc1a39fd24
commit 87399a56db
3 changed files with 14 additions and 12 deletions

View File

@@ -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 */