Fix for sqlite3_blob_write(): If either 3rd or 4th argument is less than zero, return SQLITE_ERROR. H17879. (CVS 5762)

FossilOrigin-Name: f6074c0b9b5ba51d131509dba2aec80d0fcf3b7e
This commit is contained in:
danielk1977 2008-10-02 14:49:01 +00:00
parent 25ef8f1c2c
commit a8b3018da4
5 changed files with 61 additions and 29 deletions

View File

@ -1,5 +1,5 @@
C Fix\sa\stypo\sthat\sprevents\sthe\ssqlite3_sql()\sinterface\sfrom\sappearing\nin\sthe\sofficial\sdocumentation.\s(CVS\s5761)
D 2008-10-02T14:33:57
C Fix\sfor\ssqlite3_blob_write():\sIf\seither\s3rd\sor\s4th\sargument\sis\sless\sthan\szero,\sreturn\sSQLITE_ERROR.\sH17879.\s(CVS\s5762)
D 2008-10-02T14:49:02
F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
F Makefile.in e4ab842f9a64ef61d57093539a8aab76b12810db
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@ -156,7 +156,7 @@ F src/sqliteLimit.h f435e728c6b620ef7312814d660a81f9356eb5c8
F src/status.c 237b193efae0cf6ac3f0817a208de6c6c6ef6d76
F src/table.c 22744786199c9195720c15a7a42cb97b2e2728d8
F src/tclsqlite.c 6a7eeff5afd8f5f10fcb7fd7806e56c725dd2b07
F src/test1.c c4de690aad182606e5914f6f3c8f43869fbdaaa8
F src/test1.c fed7656affe3bc687043bb76d13650a40cb21aef
F src/test2.c 897528183edf2839c2a3c991d415905db56f1240
F src/test3.c e85b7ce5c28c3ce7fbdbf7f98e1467b19786c62b
F src/test4.c 41056378671e7b00e6305fa9ac6fa27e6f96f406
@ -194,7 +194,7 @@ F src/vdbe.h 41c99aaad9167c1b5431993db446de74b2f71fc3
F src/vdbeInt.h b48c74d86a9fb62b707a3186ccca76bb32f1c6be
F src/vdbeapi.c c0f87aabb2bcf8c760ff9cb289119f7f6ba1797a
F src/vdbeaux.c 20a7d109c95e32beee7891fba828c63e419af26c
F src/vdbeblob.c f93110888ddc246215e9ba1f831d3d375bfd8355
F src/vdbeblob.c b0dcebfafedcf9c0addc7901ad98f6f986c08935
F src/vdbefifo.c 20fda2a7c4c0bcee1b90eb7e545fefcdbf2e1de7
F src/vdbemem.c ead88713b852576e2a924bc4ae696964bfbaec0a
F src/vtab.c 527c180e9c5fca417c9167d02af4b5039f892b4b
@ -363,7 +363,7 @@ F test/in.test d49419c6df515852f477fa513f3317181d46bc92
F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75
F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0
F test/in4.test c043f75147295e9f6ad5040a5cda2c485736c2c8
F test/incrblob.test e50cf41ac64e76ca4f8881ecb8d28fd988503ad5
F test/incrblob.test 4040ac885090f147345bedb89bf5e9b5eee1c1f0
F test/incrblob2.test c82a780356bdf4d0c77f1adf0ea888248904fc07
F test/incrblob_err.test c577c91d4ed9e8336cdb188b15d6ee2a6fe9604e
F test/incrvacuum.test 9a6346c56ffa141024054ae7ba6c8655edf2d137
@ -638,7 +638,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
P 803a1736d56b3c07b8ad38715fe0e39196ecc507
R 243556cb0b1b86e08eea9d0132581848
U drh
Z d6769dceda655ca5c441f3e442cce59a
P b46814b202f4cc355b925551c90ea811f3f9e44a
R 362ac30c5f648c7676e341baf41a9564
U danielk1977
Z c307b688eb6312afb2158a48404fe616

View File

@ -1 +1 @@
b46814b202f4cc355b925551c90ea811f3f9e44a
f6074c0b9b5ba51d131509dba2aec80d0fcf3b7e

View File

@ -13,7 +13,7 @@
** is not included in the SQLite library. It is used for automated
** testing of the SQLite library.
**
** $Id: test1.c,v 1.325 2008/09/11 10:29:16 danielk1977 Exp $
** $Id: test1.c,v 1.326 2008/10/02 14:49:02 danielk1977 Exp $
*/
#include "sqliteInt.h"
#include "tcl.h"
@ -1559,7 +1559,7 @@ static int test_blob_read(
}
/*
** sqlite3_blob_write CHANNEL OFFSET DATA
** sqlite3_blob_write CHANNEL OFFSET DATA ?NDATA?
**
** This command is used to test the sqlite3_blob_write() in ways that
** the Tcl channel interface does not. The first argument should
@ -1588,16 +1588,13 @@ static int test_blob_write(
unsigned char *zBuf;
int nBuf;
if( objc!=4 ){
Tcl_WrongNumArgs(interp, 1, objv, "CHANNEL OFFSET DATA");
if( objc!=4 && objc!=5 ){
Tcl_WrongNumArgs(interp, 1, objv, "CHANNEL OFFSET DATA ?NDATA?");
return TCL_ERROR;
}
channel = Tcl_GetChannel(interp, Tcl_GetString(objv[1]), &notUsed);
if( !channel
|| TCL_OK!=Tcl_GetIntFromObj(interp, objv[2], &iOffset)
|| iOffset<0
){
if( !channel || TCL_OK!=Tcl_GetIntFromObj(interp, objv[2], &iOffset) ){
return TCL_ERROR;
}
@ -1605,6 +1602,9 @@ static int test_blob_write(
pBlob = *((sqlite3_blob **)instanceData);
zBuf = Tcl_GetByteArrayFromObj(objv[3], &nBuf);
if( objc==5 && Tcl_GetIntFromObj(interp, objv[4], &nBuf) ){
return TCL_ERROR;
}
rc = sqlite3_blob_write(pBlob, zBuf, nBuf, iOffset);
if( rc!=SQLITE_OK ){
Tcl_SetResult(interp, (char *)sqlite3TestErrorName(rc), TCL_VOLATILE);

View File

@ -12,7 +12,7 @@
**
** This file contains code used to implement incremental BLOB I/O.
**
** $Id: vdbeblob.c,v 1.25 2008/07/28 19:34:54 drh Exp $
** $Id: vdbeblob.c,v 1.26 2008/10/02 14:49:02 danielk1977 Exp $
*/
#include "sqliteInt.h"
@ -287,17 +287,17 @@ static int blobReadWrite(
Vdbe *v;
sqlite3 *db = p->db;
/* Request is out of range. Return a transient error. */
if( (iOffset+n)>p->nByte ){
return SQLITE_ERROR;
}
sqlite3_mutex_enter(db->mutex);
/* If there is no statement handle, then the blob-handle has
** already been invalidated. Return SQLITE_ABORT in this case.
*/
v = (Vdbe*)p->pStmt;
if( v==0 ){
if( n<0 || iOffset<0 || (iOffset+n)>p->nByte ){
/* Request is out of range. Return a transient error. */
rc = SQLITE_ERROR;
sqlite3Error(db, SQLITE_ERROR, 0);
} else if( v==0 ){
/* If there is no statement handle, then the blob-handle has
** already been invalidated. Return SQLITE_ABORT in this case.
*/
rc = SQLITE_ABORT;
}else{
/* Call either BtreeData() or BtreePutData(). If SQLITE_ABORT is

View File

@ -9,7 +9,7 @@
#
#***********************************************************************
#
# $Id: incrblob.test,v 1.21 2008/09/11 11:28:00 danielk1977 Exp $
# $Id: incrblob.test,v 1.22 2008/10/02 14:49:02 danielk1977 Exp $
#
set testdir [file dirname $argv0]
@ -618,4 +618,36 @@ do_test incrblob-7.6 {
sqlite3_errmsg db
} {attempt to write a readonly database}
# Test that if either the "offset" or "amount" arguments to
# sqlite3_blob_write() are less than zero, SQLITE_ERROR is returned.
#
do_test incrblob-8.1 {
execsql { INSERT INTO t1 VALUES(314159, 'sqlite') }
set ::b [db incrblob t1 b 314159]
fconfigure $::b -translation binary
set rc [catch {sqlite3_blob_write $::b 10 HELLO -1} msg]
lappend rc $msg
} {1 SQLITE_ERROR}
do_test incrblob-8.2 {
sqlite3_errcode db
} {SQLITE_ERROR}
do_test incrblob-8.3 {
set rc [catch {sqlite3_blob_write $::b -1 HELLO 5} msg]
lappend rc $msg
} {1 SQLITE_ERROR}
do_test incrblob-8.4 {
sqlite3_errcode db
} {SQLITE_ERROR}
do_test incrblob-8.5 {
execsql {SELECT b FROM t1 WHERE a = 314159}
} {sqlite}
do_test incrblob-8.6 {
set rc [catch {sqlite3_blob_write $::b 0 etilqs 6} msg]
lappend rc $msg
} {0 {}}
do_test incrblob-8.7 {
execsql {SELECT b FROM t1 WHERE a = 314159}
} {etilqs}
finish_test