]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add enforcement of the obscure JSON5 syntax rule that the \0 escape
authordrh <>
Sat, 10 May 2025 15:53:17 +0000 (15:53 +0000)
committerdrh <>
Sat, 10 May 2025 15:53:17 +0000 (15:53 +0000)
sequence must not be followed by a digit.
[forum:/forumpost/c061e87faf7d1c55|Forum post c061e87faf].

FossilOrigin-Name: 83c7477f2b9b0d6cb54cf6b14bf3c8ef4807e4bddc7986d275cf6717da8606b7

manifest
manifest.uuid
src/json.c

index 2587db58a54d6d1d37f072b59f556a9b9d417508..eff755a838aa7b13570419106736b79c3adc9e62 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sPRAGMA\strusted_schema=OFF\sand\ssimilar\sso\sthat\sit\srestricts\sthe\skinds\nof\sfunctions\sin\sCHECK\sconstraints\sthat\sthe\sdocumentation\ssays\sit\sdoes.\s\sIt\nwas\sletting\sthrough\ssome\sfunction\sthat\sit\sought\snot\shave.\s\sThis\sis\sa\ndefect\sin\s[5720924cb07766cd].\s\sSee\n[forum:/forumpost/3fa9d44c0b381342|forum\sthread\s2025-05-08T08:50Z].\nAdditional\stest\scases\swill\sbe\sadded\sseparately.
-D 2025-05-08T16:18:18.268
+C Add\senforcement\sof\sthe\sobscure\sJSON5\ssyntax\srule\sthat\sthe\s&#92;0\sescape\nsequence\smust\snot\sbe\sfollowed\sby\sa\sdigit.\n[forum:/forumpost/c061e87faf7d1c55|Forum\spost\sc061e87faf].
+D 2025-05-10T15:53:17.629
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -746,7 +746,7 @@ F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf
 F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6
 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
 F src/insert.c d05934dfab2c5c0c480fc6fd2038f11215661de08ea6ff38d2563216bd555c1b
-F src/json.c 44337d95da897bc2dafd381e5ea368f7b44412a161912c9476bd00ef6ba96258
+F src/json.c c63af6fa729e2cc8023ae49991306b0c7d63bc250f5d1fe0c68a267a70454ebe
 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
 F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36
 F src/main.c 07f78d917ffcdf327982840cfd8e855fd000527a2ea5ace372ce4febcbd0bf97
@@ -2207,8 +2207,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P ac2aa39f7e3ae7ac921fac6566186939a1282f80ced5b3e3d5006a77ecf583ff
-R 120a74143a99085785628ecaf4c3a280
+P 25920beebf71ebc9a1bb9f56932280c9e03390f26fe9da2258f950979b238ce6
+R 2ed42cd65cfe520c39e7dd7284fcf114
 U drh
-Z aaef89e67a70528b909d01d425acdd0f
+Z b145400b6c965e6bf1e844ae4249528c
 # Remove this line to create a well-formed Fossil manifest.
index 17b6640b3211a9674c90c719521630e9280e9952..0f02353844951a0b7bc4baac14ca4b021678200d 100644 (file)
@@ -1 +1 @@
-25920beebf71ebc9a1bb9f56932280c9e03390f26fe9da2258f950979b238ce6
+83c7477f2b9b0d6cb54cf6b14bf3c8ef4807e4bddc7986d275cf6717da8606b7
index edd1df54f16ede2b297862df4c73683ade5aa256..e1b019d784716204aa13e8c99cdfa9f3b43ce00d 100644 (file)
@@ -1756,7 +1756,8 @@ json_parse_restart:
            || c=='n' || c=='r' || c=='t'
            || (c=='u' && jsonIs4Hex(&z[j+1])) ){
           if( opcode==JSONB_TEXT ) opcode = JSONB_TEXTJ;
-        }else if( c=='\'' || c=='0' || c=='v' || c=='\n'
+        }else if( c=='\'' ||  c=='v' || c=='\n'
+           || (c=='0' && !sqlite3Isdigit(z[j+1]))
            || (0xe2==(u8)c && 0x80==(u8)z[j+1]
                 && (0xa8==(u8)z[j+2] || 0xa9==(u8)z[j+2]))
            || (c=='x' && jsonIs2Hex(&z[j+1])) ){
@@ -2724,7 +2725,10 @@ static u32 jsonUnescapeOneChar(const char *z, u32 n, u32 *piOut){
     case 'r': {   *piOut = '\r';  return 2; }
     case 't': {   *piOut = '\t';  return 2; }
     case 'v': {   *piOut = '\v';  return 2; }
-    case '0': {   *piOut = 0;     return 2; }
+    case '0': {
+      *piOut = (n>2 && sqlite3Isdigit(z[2])) ? JSON_INVALID_CHAR : 0;
+      return 2;
+    }
     case '\'':
     case '"':
     case '/':