]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Security enhancements to the untested and unused fossildelta.c extension.
authordrh <>
Tue, 19 May 2026 11:15:33 +0000 (11:15 +0000)
committerdrh <>
Tue, 19 May 2026 11:15:33 +0000 (11:15 +0000)
Bug reports [bugs:/forumpost/3ac3fe3d71|3ac3fe3d71] and
[bugs:/forumpost/e7e470b760|e7e470b760].

FossilOrigin-Name: 2d3fbbe421d3b0ad8fa08255fd30af7f2d947919ebb90fa9c9c4ee72ffd880b4

ext/misc/fossildelta.c
manifest
manifest.uuid

index e2de0ec40f1c93b55532e6445c50afc450912c39..721e6c2b853d20cd8085f39b0bc1004add9a0f1c 100644 (file)
 ** RBU does not use this extension directly.  Rather, this extension is
 ** provided as a convenience to developers who want to analyze RBU files
 ** that contain deltas.
+**
+** Typical build commands assuming
+** 
+**    DIR=ext/misc
+*     NAME=fossildelta
+**
+** First run "make sqlite3ext.h" then:
+**
+**   linux: gcc -shared -I. -fPIC -o $NAME.so $DIR/$NAME.c
+**   OS-X:  gcc -dynamiclib -fPIC -I. -o $NAME.dylib $DIR/$NAME.c
+**   Win11: cl -I. $DIR/$NAME.c -link -dll -out:$NAME.dll
 */
 #include <string.h>
 #include <assert.h>
@@ -43,6 +54,7 @@ SQLITE_EXTENSION_INIT1
 */
 typedef unsigned int u32;
 typedef sqlite3_uint64 u64;
+typedef sqlite3_int64 i64;
 
 /*
 ** Must be a 16-bit value
@@ -769,11 +781,11 @@ struct deltaparsevtab_vtab {
 struct deltaparsevtab_cursor {
   sqlite3_vtab_cursor base;  /* Base class - must be first */
   char *aDelta;              /* The delta being parsed */
-  int nDelta;                /* Number of bytes in the delta */
-  int iCursor;               /* Current cursor location */
+  i64 iCursor;               /* Current cursor location */
+  i64 iNext;                 /* Next cursor value */
+  i64 nDelta;                /* Number of bytes in the delta */
   int eOp;                   /* Name of current operator */
   unsigned int a1, a2;       /* Arguments to current operator */
-  int iNext;                 /* Next cursor value */
 };
 
 /* Operator names:
@@ -887,14 +899,14 @@ static int deltaparsevtabNext(sqlite3_vtab_cursor *cur){
       }
       pCur->a2 = deltaGetInt(&z, &i);
       pCur->eOp = DELTAPARSE_OP_COPY;
-      pCur->iNext = (int)(&z[1] - pCur->aDelta);
+      pCur->iNext = (i64)(&z[1] - pCur->aDelta);
       break;
     }
     case ':': {
       z++;
       pCur->a2 = (unsigned int)(z - pCur->aDelta);
       pCur->eOp = DELTAPARSE_OP_INSERT;
-      pCur->iNext = (int)(&z[pCur->a1] - pCur->aDelta);
+      pCur->iNext = (i64)(&z[pCur->a1] - pCur->aDelta);
       break;
     }
     case ';': {
@@ -938,7 +950,7 @@ static int deltaparsevtabColumn(
       if( pCur->eOp==DELTAPARSE_OP_COPY ){
         sqlite3_result_int(ctx, pCur->a2);
       }else if( pCur->eOp==DELTAPARSE_OP_INSERT ){
-        if( pCur->a2 + pCur->a1 > pCur->nDelta ){
+        if( (i64)pCur->a2 + (i64)pCur->a1 > pCur->nDelta ){
           sqlite3_result_zeroblob(ctx, pCur->a1);
         }else{
           sqlite3_result_blob(ctx, pCur->aDelta+pCur->a2, pCur->a1,
@@ -1014,7 +1026,7 @@ static int deltaparsevtabFilter(
     return SQLITE_OK;
   }
   a++;
-  pCur->iNext = (unsigned int)(a - pCur->aDelta);
+  pCur->iNext = (i64)(a - pCur->aDelta);
   return SQLITE_OK;
 }
 
index 3d6e5366a23906468f3c70279507c26a2efb263b..76292f655e78349534164158386771e85f92d8b9 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Limit\sthe\ssize\sof\sinput\sstrings\sto\sthe\s(disused)\sspellfix\sextension\nto\savoid\sexcessive\sruntime\sand\sinteger\soverflows.\n[bugs:/forumpost/24a33e5d10|Bugs\sreport\s24a33e5d10].
-D 2026-05-19T10:30:13.196
+C Security\senhancements\sto\sthe\suntested\sand\sunused\sfossildelta.c\sextension.\nBug\sreports\s[bugs:/forumpost/3ac3fe3d71|3ac3fe3d71]\sand\n[bugs:/forumpost/e7e470b760|e7e470b760].
+D 2026-05-19T11:15:33.265
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -377,7 +377,7 @@ F ext/misc/decimal.c 432e5b03a0e2a68a1846a9852a565a1b546ca9b295deda834e4653f0f55
 F ext/misc/eval.c 04bc9aada78c888394204b4ed996ab834b99726fb59603b0ee3ed6e049755dc1
 F ext/misc/explain.c 9670c8ff7b255eea7845abc5123a4958e74016c16990b10497e56380f91704b9
 F ext/misc/fileio.c 936c0a7b3382a047d833ad33f62ba59a3847b79ea745bf529797cd344966fbb0
-F ext/misc/fossildelta.c 40add35db7f355d29ae856fe09043e66802fceff6f2551baccb28d794cadbc77
+F ext/misc/fossildelta.c 6aa3f15279cd2d796583e3ff654be7d2df745fdbea7987c1640e78ce1fac899e
 F ext/misc/fuzzer.c decaca5a3479dfba69576cd41d4e17161eaf154a5438e12d316bbc5853571802
 F ext/misc/ieee754.c 2901d08a586d00a1d3c0fd89e03c57ee9e2b5f013b0daab9e49c7a48a9d5946b
 F ext/misc/memstat.c 03ab52d2d841eb3f55118105c1964d5225f152b23bd708844c648b48d14ccbcf
@@ -2205,8 +2205,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 4880adc053b0f21633936347fd5610e4338b15da39607d8ba5a6b32d1516e8cb
-R c278f651f777125c2d9466f5880429fa
+P 4b16b80cf2e26c41f0828d65883145dc81c0987110c3f04a864cec43e7c418e5
+R 59d5a66efa1e70342f9560d0d82bbc44
 U drh
-Z 243bb07023fe1be2b1f6d0ad563fd1b9
+Z 358e2b2e45f4495520024557411695d0
 # Remove this line to create a well-formed Fossil manifest.
index f8e1473dca09221e761f15c80237d557bb07d494..5453b915fbd3f67e0ce1e39cecc2ce7071e1671f 100644 (file)
@@ -1 +1 @@
-4b16b80cf2e26c41f0828d65883145dc81c0987110c3f04a864cec43e7c418e5
+2d3fbbe421d3b0ad8fa08255fd30af7f2d947919ebb90fa9c9c4ee72ffd880b4