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:
parent
159e6b304c
commit
3cc89d9567
@ -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
|
||||
|
@ -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);
|
||||
|
16
manifest
16
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
|
||||
|
@ -1 +1 @@
|
||||
aeca95ac77f6f320a916f7e3c5a7a588ef4a20c8
|
||||
b9459d5980c6249a5c1bc5ea72cb4f3b1ba0e433
|
Loading…
x
Reference in New Issue
Block a user