Fix problems in the sessions module causing it to produce spurious SQLITE_NOMEM errors when handling SQL text or blob values zero bytes in size.

FossilOrigin-Name: b9459d5980c6249a5c1bc5ea72cb4f3b1ba0e433
This commit is contained in:
dan 2015-04-08 16:43:31 +00:00
parent 159e6b304c
commit 3cc89d9567
4 changed files with 28 additions and 15 deletions

View 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

View 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);

View File

@ -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

View File

@ -1 +1 @@
aeca95ac77f6f320a916f7e3c5a7a588ef4a20c8
b9459d5980c6249a5c1bc5ea72cb4f3b1ba0e433