]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix problems in the sessions module causing it to produce spurious SQLITE_NOMEM error...
authordan <dan@noemail.net>
Wed, 8 Apr 2015 16:43:31 +0000 (16:43 +0000)
committerdan <dan@noemail.net>
Wed, 8 Apr 2015 16:43:31 +0000 (16:43 +0000)
FossilOrigin-Name: b9459d5980c6249a5c1bc5ea72cb4f3b1ba0e433

ext/session/session2.test
ext/session/sqlite3session.c
manifest
manifest.uuid

index 04be5f0917fa7de42a0ce3006c3577f8867ad8ba..0035e39dbf60b36aa1ce92e4bffd81b37757f1cd 100644 (file)
@@ -169,7 +169,17 @@ set set_of_tests {
     INSERT INTO %T4% VALUES('def', 'abc');
   }
   17 { UPDATE %T4% SET b = 1 }
+
   18 { DELETE FROM %T4% WHERE 1 }
+
+  19 { 
+    INSERT INTO t1 VALUES('', '');
+    INSERT INTO t1 VALUES(X'', X'');
+  }
+  20 { 
+    DELETE FROM t1;
+    INSERT INTO t1 VALUES('', NULL);
+  }
 }
 
 test_reset
index f861bd1ec65c20fd845e72bd77cf0e9acd6e2d89..946681a4b353298f4f8f6aedc1013a736ff1f38f 100644 (file)
@@ -316,8 +316,8 @@ static int sessionSerializeValue(
         }else{
           z = (u8 *)sqlite3_value_blob(pValue);
         }
-        if( z==0 ) return SQLITE_NOMEM;
         n = sqlite3_value_bytes(pValue);
+        if( z==0 && (eType!=SQLITE_BLOB || n>0) ) return SQLITE_NOMEM;
         nVarint = sessionVarintLen(n);
   
         if( aBuf ){
@@ -435,13 +435,15 @@ static int sessionPreupdateHash(
         h = sessionHashAppendI64(h, iVal);
       }else if( eType==SQLITE_TEXT || eType==SQLITE_BLOB ){
         const u8 *z;
+        int n;
         if( eType==SQLITE_TEXT ){
           z = (const u8 *)sqlite3_value_text(pVal);
         }else{
           z = (const u8 *)sqlite3_value_blob(pVal);
         }
-        if( !z ) return SQLITE_NOMEM;
-        h = sessionHashAppendBlob(h, sqlite3_value_bytes(pVal), z);
+        n = sqlite3_value_bytes(pVal);
+        if( !z && (eType!=SQLITE_BLOB || n>0) ) return SQLITE_NOMEM;
+        h = sessionHashAppendBlob(h, n, z);
       }else{
         assert( eType==SQLITE_NULL );
         *pbNullPK = 1;
@@ -1500,13 +1502,14 @@ static void sessionAppendCol(
     }
     if( eType==SQLITE_BLOB || eType==SQLITE_TEXT ){
       u8 *z;
+      int nByte;
       if( eType==SQLITE_BLOB ){
         z = (u8 *)sqlite3_column_blob(pStmt, iCol);
       }else{
         z = (u8 *)sqlite3_column_text(pStmt, iCol);
       }
-      if( z ){
-        int nByte = sqlite3_column_bytes(pStmt, iCol);
+      nByte = sqlite3_column_bytes(pStmt, iCol);
+      if( z || (eType==SQLITE_BLOB && nByte==0) ){
         sessionAppendVarint(p, nByte, pRc);
         sessionAppendBlob(p, z, nByte, pRc);
       }else{
@@ -2179,7 +2182,7 @@ static int sessionValueSetStr(
   ** argument to sqlite3ValueSetStr() and have the copy created 
   ** automatically. But doing so makes it difficult to detect any OOM
   ** error. Hence the code to create the copy externally. */
-  u8 *aCopy = sqlite3_malloc(nData);
+  u8 *aCopy = sqlite3_malloc(nData+1);
   if( aCopy==0 ) return SQLITE_NOMEM;
   memcpy(aCopy, aData, nData);
   sqlite3ValueSetStr(pVal, nData, (char*)aCopy, enc, sqlite3_free);
index 42a45e41f3f4844c51e632057730faafc01112d4..b53ebc56fc84609d02fdf8ef740272bc4b18e50a 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Merge\sprintf()\swidth\sand\sprecision\soverflow\sfixes\sfrom\strunk.
-D 2015-04-07T23:10:44.364
+C Fix\sproblems\sin\sthe\ssessions\smodule\scausing\sit\sto\sproduce\sspurious\sSQLITE_NOMEM\serrors\swhen\shandling\sSQL\stext\sor\sblob\svalues\szero\sbytes\sin\ssize.
+D 2015-04-08T16:43:31.690
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 3083cf0c2bc6618e532b9478ce735bb512322985
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -148,7 +148,7 @@ F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de
 F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024
 F ext/session/changeset.c 4ccbaa4531944c24584bf6a61ba3a39c62b6267a
 F ext/session/session1.test 4653867f32a98ce4bbb4a181aac6debe51ca4dfb
-F ext/session/session2.test 99ca0da7ddb617d42bafd83adccf99f18ae0384b
+F ext/session/session2.test a95a2d270b32638c1acba7cb9c81856712d469ac
 F ext/session/session3.test a7a9ce59b8d1e49e2cc23d81421ac485be0eea01
 F ext/session/session4.test a6ed685da7a5293c5d6f99855bcf41dbc352ca84
 F ext/session/session5.test 716bc6fafd625ce60dfa62ae128971628c1a1169
@@ -160,7 +160,7 @@ F ext/session/sessionB.test 06961b7c3641151f5d23088250ecad132501113c
 F ext/session/sessionC.test 3982f8577b0744c5ce3aaef7cfeb5bd903f17fe4
 F ext/session/session_common.tcl 9de0451b6a47218fc16b9ed8876b6238a0a3d88d
 F ext/session/sessionfault.test bef044d0952c0d62c31c8d2400be72c8684545cc
-F ext/session/sqlite3session.c 838050c4c217d2843e4705b14be25d8f0457f155
+F ext/session/sqlite3session.c 7c6516f0342772441bcd2d845760902cfc0b39b8
 F ext/session/sqlite3session.h 16608d29879a0ed3c6be6b7fb18dcdb5c707aaef
 F ext/session/test_session.c a28352e99bc6a83b94e4cce99a7bf25c73d6d489
 F ext/userauth/sqlite3userauth.h 19cb6f0e31316d0ee4afdfb7a85ef9da3333a220
@@ -1267,7 +1267,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 271c110bcf5bf2ea7e113dd01dec876a08e3c047 8e4ac2ce24415926247961b00a62425ae85d6ffb
-R e52a83cd9a76eb22e0a9f49afec82395
-U drh
-Z 65d91c87ac07196da2d7921b7b9389b5
+P aeca95ac77f6f320a916f7e3c5a7a588ef4a20c8
+R 2b6c500da0e9b0a3fd57accc4dad1058
+U dan
+Z aded3edd721aa55f05087866d9fe12cb
index e451de8f37e021a89e17ab58e7036f605d2b39db..27eccb5ef6695d0e6b7fc5be2fbd408dce9fee92 100644 (file)
@@ -1 +1 @@
-aeca95ac77f6f320a916f7e3c5a7a588ef4a20c8
\ No newline at end of file
+b9459d5980c6249a5c1bc5ea72cb4f3b1ba0e433
\ No newline at end of file