mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-02 05:54:29 +03:00
Rig the sqliteMalloc() routine so that we can make it fail multiple times
in a row. Modify the malloc.test procedure to make malloc fail in this way and verify that the failures are still handled correctly. (CVS 2121) FossilOrigin-Name: 519bc9d9975bbdb4ba056799534d5c465e0cd042
This commit is contained in:
18
manifest
18
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Fix\ssegfaults\sthat\smight\soccur\safter\sa\smalloc\sfailure.\s(CVS\s2119)
|
C Rig\sthe\ssqliteMalloc()\sroutine\sso\sthat\swe\scan\smake\sit\sfail\smultiple\stimes\nin\sa\srow.\s\sModify\sthe\smalloc.test\sprocedure\sto\smake\smalloc\sfail\sin\sthis\nway\sand\sverify\sthat\sthe\sfailures\sare\sstill\shandled\scorrectly.\s(CVS\s2121)
|
||||||
D 2004-11-20T18:13:10
|
D 2004-11-20T19:18:01
|
||||||
F Makefile.in e747bb5ba34ccbdd81f79dcf1b2b33c02817c21d
|
F Makefile.in e747bb5ba34ccbdd81f79dcf1b2b33c02817c21d
|
||||||
F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
|
F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
|
||||||
F README a01693e454a00cc117967e3f9fdab2d4d52e9bc1
|
F README a01693e454a00cc117967e3f9fdab2d4d52e9bc1
|
||||||
@@ -61,10 +61,10 @@ F src/random.c eff68e3f257e05e81eae6c4d50a51eb88beb4ff3
|
|||||||
F src/select.c cf4b7952d6d214931c52636ee726f19ee2a275c5
|
F src/select.c cf4b7952d6d214931c52636ee726f19ee2a275c5
|
||||||
F src/shell.c 55adda3cf3c1cc2f6c1919aac17b2318f9c2a96f
|
F src/shell.c 55adda3cf3c1cc2f6c1919aac17b2318f9c2a96f
|
||||||
F src/sqlite.h.in 6d0e82c24ef3f84a10b468119f3943a5dfc806c7
|
F src/sqlite.h.in 6d0e82c24ef3f84a10b468119f3943a5dfc806c7
|
||||||
F src/sqliteInt.h dd26056a172a5d488a78846b5ed8db6953db4e5d
|
F src/sqliteInt.h 8f3b4d0e90c294e0e22b20a9f7f32f2523b8894c
|
||||||
F src/table.c 25b3ff2b39b7d87e8d4a5da0713d68dfc06cbee9
|
F src/table.c 25b3ff2b39b7d87e8d4a5da0713d68dfc06cbee9
|
||||||
F src/tclsqlite.c 7f1a1a678140e6901c8954590ca2aabe50b48f71
|
F src/tclsqlite.c 7f1a1a678140e6901c8954590ca2aabe50b48f71
|
||||||
F src/test1.c 33818d5894681236240daaea1d379b463c7e9019
|
F src/test1.c 21b1cc9358678da579d7aad8f16a40735a837078
|
||||||
F src/test2.c b11fa244fff02190707dd0879987c37c75e61fc8
|
F src/test2.c b11fa244fff02190707dd0879987c37c75e61fc8
|
||||||
F src/test3.c 6f1ec93e13632a004b527049535079eda84c459d
|
F src/test3.c 6f1ec93e13632a004b527049535079eda84c459d
|
||||||
F src/test4.c 7c6b9fc33dd1f3f93c7f1ee6e5e6d016afa6c1df
|
F src/test4.c 7c6b9fc33dd1f3f93c7f1ee6e5e6d016afa6c1df
|
||||||
@@ -73,7 +73,7 @@ F src/tokenize.c 2ad3d1ae1a0a70746db0b31a0a74f58050a3c39a
|
|||||||
F src/trigger.c 0c91b56182560263733e4b035acdb939bd1cf0e2
|
F src/trigger.c 0c91b56182560263733e4b035acdb939bd1cf0e2
|
||||||
F src/update.c 395a2b270dfcbc96c20e40c9cb42b0533768ce30
|
F src/update.c 395a2b270dfcbc96c20e40c9cb42b0533768ce30
|
||||||
F src/utf.c e45ce11be6922408cd381561721f6cca7d3b992a
|
F src/utf.c e45ce11be6922408cd381561721f6cca7d3b992a
|
||||||
F src/util.c 005fdf2d008f3429d081766ad6098fdd86d8d8e6
|
F src/util.c 4a8db4e97a3cfda12ad8dda3e77dd2d00ad1de5e
|
||||||
F src/vacuum.c ecb4a2c6f1ac5cc9b394dc64d3bb14ca650c4f60
|
F src/vacuum.c ecb4a2c6f1ac5cc9b394dc64d3bb14ca650c4f60
|
||||||
F src/vdbe.c ba3a920731d43bcf2497d558238400369008531a
|
F src/vdbe.c ba3a920731d43bcf2497d558238400369008531a
|
||||||
F src/vdbe.h 067ca8d6750ba4f69a50284765e5883dee860181
|
F src/vdbe.h 067ca8d6750ba4f69a50284765e5883dee860181
|
||||||
@@ -145,7 +145,7 @@ F test/lock2.test 59c3dd7d9b24d1bf7ec91b2d1541c37e97939d5f
|
|||||||
F test/lock3.test 615111293cf32aa2ed16d01c6611737651c96fb9
|
F test/lock3.test 615111293cf32aa2ed16d01c6611737651c96fb9
|
||||||
F test/lock4.test 07768b4d4e942693d6036f1e6502199a3fa22a4f
|
F test/lock4.test 07768b4d4e942693d6036f1e6502199a3fa22a4f
|
||||||
F test/main.test 5f9deae11b93336da1ccc5f91cf8be075c91ddf1
|
F test/main.test 5f9deae11b93336da1ccc5f91cf8be075c91ddf1
|
||||||
F test/malloc.test 769b240d89a7ef3320d88919fdb6765f9395a51f
|
F test/malloc.test b4674cbb5a72b113eedaaf64fcd5c062e9957ded
|
||||||
F test/memdb.test 34ee8598de307a16ccc3ac91b85cee9c668ae5ed
|
F test/memdb.test 34ee8598de307a16ccc3ac91b85cee9c668ae5ed
|
||||||
F test/memleak.test f1fa233f8295dd1d955a00d5e5ee857850f27f29
|
F test/memleak.test f1fa233f8295dd1d955a00d5e5ee857850f27f29
|
||||||
F test/minmax.test c0f92d3f7b11656221735385f2c8b1878bbbdaf6
|
F test/minmax.test c0f92d3f7b11656221735385f2c8b1878bbbdaf6
|
||||||
@@ -260,7 +260,7 @@ F www/tclsqlite.tcl 560ecd6a916b320e59f2917317398f3d59b7cc25
|
|||||||
F www/vdbe.tcl 095f106d93875c94b47367384ebc870517431618
|
F www/vdbe.tcl 095f106d93875c94b47367384ebc870517431618
|
||||||
F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0
|
F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0
|
||||||
F www/whentouse.tcl fdacb0ba2d39831e8a6240d05a490026ad4c4e4c
|
F www/whentouse.tcl fdacb0ba2d39831e8a6240d05a490026ad4c4e4c
|
||||||
P aceaa5f6e97c93962f5d6d14de8a490efa619db4
|
P 368774487e7a0266465f5a1c2701c9b14573d26c
|
||||||
R 8f9d5443bb2a95ac89805536ee413fef
|
R 2d696b4b112d3e16cd5eeec0f1da51b4
|
||||||
U drh
|
U drh
|
||||||
Z 96591b175a33effa711ce86d94861df3
|
Z f7c4d9f04ce181b804404f872e7ac015
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
368774487e7a0266465f5a1c2701c9b14573d26c
|
519bc9d9975bbdb4ba056799534d5c465e0cd042
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
*************************************************************************
|
*************************************************************************
|
||||||
** Internal interface definitions for SQLite.
|
** Internal interface definitions for SQLite.
|
||||||
**
|
**
|
||||||
** @(#) $Id: sqliteInt.h,v 1.340 2004/11/16 15:50:20 danielk1977 Exp $
|
** @(#) $Id: sqliteInt.h,v 1.341 2004/11/20 19:18:01 drh Exp $
|
||||||
*/
|
*/
|
||||||
#ifndef _SQLITEINT_H_
|
#ifndef _SQLITEINT_H_
|
||||||
#define _SQLITEINT_H_
|
#define _SQLITEINT_H_
|
||||||
@@ -250,9 +250,10 @@ extern int sqlite3_malloc_failed;
|
|||||||
** only. They only work if SQLITE_DEBUG is defined.
|
** only. They only work if SQLITE_DEBUG is defined.
|
||||||
*/
|
*/
|
||||||
#ifdef SQLITE_DEBUG
|
#ifdef SQLITE_DEBUG
|
||||||
extern int sqlite3_nMalloc; /* Number of sqliteMalloc() calls */
|
extern int sqlite3_nMalloc; /* Number of sqliteMalloc() calls */
|
||||||
extern int sqlite3_nFree; /* Number of sqliteFree() calls */
|
extern int sqlite3_nFree; /* Number of sqliteFree() calls */
|
||||||
extern int sqlite3_iMallocFail; /* Fail sqliteMalloc() after this many calls */
|
extern int sqlite3_iMallocFail; /* Fail sqliteMalloc() after this many calls */
|
||||||
|
extern int sqlite3_iMallocReset; /* Set iMallocFail to this when it reaches 0 */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
22
src/test1.c
22
src/test1.c
@@ -13,7 +13,7 @@
|
|||||||
** is not included in the SQLite library. It is used for automated
|
** is not included in the SQLite library. It is used for automated
|
||||||
** testing of the SQLite library.
|
** testing of the SQLite library.
|
||||||
**
|
**
|
||||||
** $Id: test1.c,v 1.115 2004/11/19 07:07:31 danielk1977 Exp $
|
** $Id: test1.c,v 1.116 2004/11/20 19:18:01 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include "tcl.h"
|
#include "tcl.h"
|
||||||
@@ -746,10 +746,15 @@ static int sqlite3_mprintf_stronly(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Usage: sqlite_malloc_fail N
|
** Usage: sqlite_malloc_fail N ?REPEAT-INTERVAL?
|
||||||
**
|
**
|
||||||
** Rig sqliteMalloc() to fail on the N-th call. Turn off this mechanism
|
** Rig sqliteMalloc() to fail on the N-th call and every REPEAT-INTERVAL call
|
||||||
** and reset the sqlite3_malloc_failed variable is N==0.
|
** after that. If REPEAT-INTERVAL is 0 or is omitted, then only a single
|
||||||
|
** malloc will fail. If REPEAT-INTERVAL is 1 then all mallocs after the
|
||||||
|
** first failure will continue to fail on every call. If REPEAT-INTERVAL is
|
||||||
|
** 2 then every other malloc will fail. And so forth.
|
||||||
|
**
|
||||||
|
** Turn off this mechanism and reset the sqlite3_malloc_failed variable is N==0.
|
||||||
*/
|
*/
|
||||||
#ifdef SQLITE_DEBUG
|
#ifdef SQLITE_DEBUG
|
||||||
static int sqlite_malloc_fail(
|
static int sqlite_malloc_fail(
|
||||||
@@ -759,12 +764,19 @@ static int sqlite_malloc_fail(
|
|||||||
char **argv /* Text of each argument */
|
char **argv /* Text of each argument */
|
||||||
){
|
){
|
||||||
int n;
|
int n;
|
||||||
if( argc!=2 ){
|
int rep;
|
||||||
|
if( argc!=2 && argc!=3 ){
|
||||||
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " N\"", 0);
|
Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], " N\"", 0);
|
||||||
return TCL_ERROR;
|
return TCL_ERROR;
|
||||||
}
|
}
|
||||||
if( Tcl_GetInt(interp, argv[1], &n) ) return TCL_ERROR;
|
if( Tcl_GetInt(interp, argv[1], &n) ) return TCL_ERROR;
|
||||||
|
if( argc==3 ){
|
||||||
|
if( Tcl_GetInt(interp, argv[2], &rep) ) return TCL_ERROR;
|
||||||
|
}else{
|
||||||
|
rep = 0;
|
||||||
|
}
|
||||||
sqlite3_iMallocFail = n;
|
sqlite3_iMallocFail = n;
|
||||||
|
sqlite3_iMallocReset = rep;
|
||||||
sqlite3_malloc_failed = 0;
|
sqlite3_malloc_failed = 0;
|
||||||
return TCL_OK;
|
return TCL_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
10
src/util.c
10
src/util.c
@@ -14,7 +14,7 @@
|
|||||||
** This file contains functions for allocating memory, comparing
|
** This file contains functions for allocating memory, comparing
|
||||||
** strings, and stuff like that.
|
** strings, and stuff like that.
|
||||||
**
|
**
|
||||||
** $Id: util.c,v 1.121 2004/11/04 04:34:15 drh Exp $
|
** $Id: util.c,v 1.122 2004/11/20 19:18:01 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
@@ -51,11 +51,15 @@ int sqlite3_malloc_failed = 0;
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
** For keeping track of the number of mallocs and frees. This
|
** For keeping track of the number of mallocs and frees. This
|
||||||
** is used to check for memory leaks.
|
** is used to check for memory leaks. The iMallocFail and iMallocReset
|
||||||
|
** values are used to simulate malloc() failures during testing in
|
||||||
|
** order to verify that the library correctly handles an out-of-memory
|
||||||
|
** condition.
|
||||||
*/
|
*/
|
||||||
int sqlite3_nMalloc; /* Number of sqliteMalloc() calls */
|
int sqlite3_nMalloc; /* Number of sqliteMalloc() calls */
|
||||||
int sqlite3_nFree; /* Number of sqliteFree() calls */
|
int sqlite3_nFree; /* Number of sqliteFree() calls */
|
||||||
int sqlite3_iMallocFail; /* Fail sqliteMalloc() after this many calls */
|
int sqlite3_iMallocFail; /* Fail sqliteMalloc() after this many calls */
|
||||||
|
int sqlite3_iMallocReset = -1; /* When iMallocFail reaches 0, set to this */
|
||||||
#if SQLITE_DEBUG>1
|
#if SQLITE_DEBUG>1
|
||||||
static int memcnt = 0;
|
static int memcnt = 0;
|
||||||
#endif
|
#endif
|
||||||
@@ -81,7 +85,7 @@ void *sqlite3Malloc_(int n, int bZero, char *zFile, int line){
|
|||||||
fprintf(stderr,"**** failed to allocate %d bytes at %s:%d\n",
|
fprintf(stderr,"**** failed to allocate %d bytes at %s:%d\n",
|
||||||
n, zFile,line);
|
n, zFile,line);
|
||||||
#endif
|
#endif
|
||||||
sqlite3_iMallocFail--;
|
sqlite3_iMallocFail = sqlite3_iMallocReset;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
# special feature is used to see what happens in the library if a malloc
|
# special feature is used to see what happens in the library if a malloc
|
||||||
# were to really fail due to an out-of-memory situation.
|
# were to really fail due to an out-of-memory situation.
|
||||||
#
|
#
|
||||||
# $Id: malloc.test,v 1.10 2004/06/30 09:49:24 danielk1977 Exp $
|
# $Id: malloc.test,v 1.11 2004/11/20 19:18:01 drh Exp $
|
||||||
|
|
||||||
set testdir [file dirname $argv0]
|
set testdir [file dirname $argv0]
|
||||||
source $testdir/tester.tcl
|
source $testdir/tester.tcl
|
||||||
@@ -33,7 +33,7 @@ for {set go 1; set i 1} {$go} {incr i} {
|
|||||||
catch {db close}
|
catch {db close}
|
||||||
catch {file delete -force test.db}
|
catch {file delete -force test.db}
|
||||||
catch {file delete -force test.db-journal}
|
catch {file delete -force test.db-journal}
|
||||||
sqlite_malloc_fail $i
|
sqlite_malloc_fail $i [expr {$i%4}]
|
||||||
set v [catch {sqlite3 db test.db} msg]
|
set v [catch {sqlite3 db test.db} msg]
|
||||||
if {$v} {
|
if {$v} {
|
||||||
set msg ""
|
set msg ""
|
||||||
|
|||||||
Reference in New Issue
Block a user