]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Do a slow-path in GetVarint32() for varints that do not fit in 32 bits.
authordrh <drh@noemail.net>
Tue, 13 May 2008 16:41:50 +0000 (16:41 +0000)
committerdrh <drh@noemail.net>
Tue, 13 May 2008 16:41:50 +0000 (16:41 +0000)
This will only happen when trying to interpret a corrupt database file
so speed is not critical. (CVS 5129)

FossilOrigin-Name: 6a6b9437367b66c3b6f710cf3abbdb9841765b21

manifest
manifest.uuid
src/util.c

index 26c6a72c4814b591f75de83bf5a84eafaf95c2f8..e5063226fd8fc87ddff88743633f2dee666fa313 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Make\sthe\sbenign-fault\ssetting\srecursive.\s\sMake\sall\smalloc\sfailures\nduring\sa\srollback\sbenign\ssince\sthere\sis\snothing\swe\scan\sdo\sabout\sthem.\s(CVS\s5128)
-D 2008-05-13T13:27:34
+C Do\sa\sslow-path\sin\sGetVarint32()\sfor\svarints\sthat\sdo\snot\sfit\sin\s32\sbits.\nThis\swill\sonly\shappen\swhen\strying\sto\sinterpret\sa\scorrupt\sdatabase\sfile\nso\sspeed\sis\snot\scritical.\s(CVS\s5129)
+D 2008-05-13T16:41:50
 F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7
 F Makefile.in 79aeba12300a54903f1b1257c1e7c190234045dd
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -165,7 +165,7 @@ F src/tokenize.c 8d77af8584cf027dc21375f0efa5818cb303c995
 F src/trigger.c 9bd3b6fa0beff4a02d262c96466f752ec15a7fc3
 F src/update.c 2d7143b9014e955509cc4f323f9a9584fb898f34
 F src/utf.c 8c94fa10efc78c2568d08d436acc59df4df7191b
-F src/util.c 4f0125fa1ba77be12e30e1b234352fc1b5abfe00
+F src/util.c 28fb90e03f83b95f6e8b1978fb60953e6cef9e3a
 F src/vacuum.c c3b2b70677f874102b8753bf494c232e777f3998
 F src/vdbe.c 81035a619a605412a782c1f01ffeb924e08759da
 F src/vdbe.h f4bb70962d9c13e0f65b215c90e8acea1ae6e8ee
@@ -634,7 +634,7 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
 F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
-P f1ed3689239098e0630e8d61f52971bcdf2801b6
-R d7bb146d74af3e1e4d1db38ff35aa3b2
+P a9d1d931358637a6f039723a053098f65530de4b
+R 435a83bf622f2e0c536254ba212845bb
 U drh
-Z 71aaa427251ef7c78206e20cadcf791d
+Z da1263aed0eae79af41ab62d5e5b89fb
index 82ac8cb7592c093a68200d14974b8370a70d1fc8..8c575dd334d3dacd03314f5eee06ab4b58d01437 100644 (file)
@@ -1 +1 @@
-a9d1d931358637a6f039723a053098f65530de4b
\ No newline at end of file
+6a6b9437367b66c3b6f710cf3abbdb9841765b21
\ No newline at end of file
index 0cd214aea2d79567589e26650e24d4fe342e4c44..886501421d00ab56082ad49f15d2b182aa8bb050 100644 (file)
@@ -14,7 +14,7 @@
 ** This file contains functions for allocating memory, comparing
 ** strings, and stuff like that.
 **
-** $Id: util.c,v 1.228 2008/05/11 11:07:07 drh Exp $
+** $Id: util.c,v 1.229 2008/05/13 16:41:50 drh Exp $
 */
 #include "sqliteInt.h"
 #include <stdarg.h>
@@ -780,55 +780,20 @@ int sqlite3GetVarint32(const unsigned char *p, u32 *v){
     return 5;
   }
 
-  p++;
-  b = b<<14;
-  b |= *p;
-  // b: p1<<28 | p3<<14 | p5 (unmasked)
-  if (!(b&0x80))
+  /* We can only reach this point when reading a corrupt database
+  ** file.  In that case we are not in any hurry.  Use the (relatively
+  ** slow) general-purpose sqlite3GetVarint() routine to extract the
+  ** value. */
   {
-    b &= (0x7f<<28)|(0x7f<<14)|(0x7f);
-    a &= (0x7f<<28)|(0x7f<<14)|(0x7f);
-    a = a<<7;
-    *v = a | b;
-    return 6;
-  }
+    u64 v64;
+    int n;
 
-  p++;
-  a = a<<14;
-  a |= *p;
-  // a: p2<<28 | p4<<14 | p6 (unmasked)
-  if (!(a&0x80))
-  {
-    a &= (0x7f<<28)|(0x7f<<14)|(0x7f);
-    b &= (0x7f<<28)|(0x7f<<14)|(0x7f);
-    b = b<<7;
-    *v = a | b;
-    return 7;
-  }
-
-  p++;
-  b = b<<14;
-  b |= *p;
-  // b: p3<<28 | p5<<14 | p7 (unmasked)
-  if (!(b&0x80))
-  {
-    b &= (0x7f<<28)|(0x7f<<14)|(0x7f);
-    a &= (0x7f<<28)|(0x7f<<14)|(0x7f);
-    a = a<<7;
-    *v = a | b;
-    return 8;
+    p -= 4;
+    n = sqlite3GetVarint(p, &v64);
+    assert( n>5 && n<=9 );
+    *v = (u32)v64;
+    return n;
   }
-
-  p++;
-  a = a<<14;
-  a |= *p;
-  // a: p4<<28 | p6<<14 | p8 (unmasked)
-
-  a &= (0x7f<<28)|(0x7f<<14)|(0x7f);
-  b &= (0x7f<<28)|(0x7f<<14)|(0x7f);
-  b = b<<7;
-  *v = a | b;
-  return 9;
 }
 
 /*