diff options
author | drh <drh@noemail.net> | 2020-10-20 14:40:53 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2020-10-20 14:40:53 +0000 |
commit | 672f07c642fad9ad76b1a8cd1c1d196d0286ffc4 (patch) | |
tree | 9ad3491a469c959189d34c65f1afdd9bb1a8e5b8 /src | |
parent | 1a56fce614ff945827281208358c1864b522bc05 (diff) | |
download | sqlite-672f07c642fad9ad76b1a8cd1c1d196d0286ffc4.tar.gz sqlite-672f07c642fad9ad76b1a8cd1c1d196d0286ffc4.zip |
Fix the sqlite3_hard_heap_limit() so that it works with sqlite3_realloc64()
in addition to sqlite3_malloc64(). Improvements to OOM processing and
debugging aids in the fuzzcheck utility.
FossilOrigin-Name: 602d7369166d406a26834aa47d71d565a17d377d32e41f308821a50b41f91896
Diffstat (limited to 'src')
-rw-r--r-- | src/malloc.c | 7 | ||||
-rw-r--r-- | src/memdb.c | 8 |
2 files changed, 12 insertions, 3 deletions
diff --git a/src/malloc.c b/src/malloc.c index 70e6ff94e..35ad21ecc 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -474,12 +474,17 @@ void *sqlite3Realloc(void *pOld, u64 nBytes){ if( nOld==nNew ){ pNew = pOld; }else if( sqlite3GlobalConfig.bMemstat ){ + sqlite3_int64 nUsed; sqlite3_mutex_enter(mem0.mutex); sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, (int)nBytes); nDiff = nNew - nOld; - if( nDiff>0 && sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED) >= + if( nDiff>0 && (nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED)) >= mem0.alarmThreshold-nDiff ){ sqlite3MallocAlarm(nDiff); + if( mem0.hardLimit>0 && nUsed >= mem0.hardLimit - nDiff ){ + sqlite3_mutex_leave(mem0.mutex); + return 0; + } } pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT diff --git a/src/memdb.c b/src/memdb.c index d07023dba..a48980aa3 100644 --- a/src/memdb.c +++ b/src/memdb.c @@ -576,8 +576,12 @@ int sqlite3_deserialize( goto end_deserialize; } zSql = sqlite3_mprintf("ATTACH x AS %Q", zSchema); - rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); - sqlite3_free(zSql); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + } if( rc ) goto end_deserialize; db->init.iDb = (u8)iDb; db->init.reopenMemdb = 1; |