diff --git a/ext/session/session2.test b/ext/session/session2.test index 04be5f0917..0035e39dbf 100644 --- a/ext/session/session2.test +++ b/ext/session/session2.test @@ -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 diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index f861bd1ec6..946681a4b3 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -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); diff --git a/manifest b/manifest index 42a45e41f3..b53ebc56fc 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index e451de8f37..27eccb5ef6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aeca95ac77f6f320a916f7e3c5a7a588ef4a20c8 \ No newline at end of file +b9459d5980c6249a5c1bc5ea72cb4f3b1ba0e433 \ No newline at end of file