diff options
author | dan <dan@noemail.net> | 2010-05-03 17:18:24 +0000 |
---|---|---|
committer | dan <dan@noemail.net> | 2010-05-03 17:18:24 +0000 |
commit | 76ed3bc044281ffc608f4a9618174ffba1a30fca (patch) | |
tree | 1c3d508da06a0b5ab892cea37c507c0f73e89d56 /src | |
parent | 4c846bb14896bc23e4403b01b255acbf37525ee8 (diff) | |
download | sqlite-76ed3bc044281ffc608f4a9618174ffba1a30fca.tar.gz sqlite-76ed3bc044281ffc608f4a9618174ffba1a30fca.zip |
Fix a couple of errors in WAL code that can occur in an OOM situation.
FossilOrigin-Name: 9d3f3736be42ef8ab48b099d4712e08dfca97873
Diffstat (limited to 'src')
-rw-r--r-- | src/os_unix.c | 7 | ||||
-rw-r--r-- | src/wal.c | 44 |
2 files changed, 27 insertions, 24 deletions
diff --git a/src/os_unix.c b/src/os_unix.c index ad95c1016..1b3223b52 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -4972,8 +4972,8 @@ static int unixShmOpen( nName = strlen(zName); pNew = sqlite3_malloc( sizeof(*pFile) + nName + 10 ); if( pNew==0 ){ - rc = SQLITE_NOMEM; - goto shm_open_err; + sqlite3_free(p); + return SQLITE_NOMEM; } memset(pNew, 0, sizeof(*pNew)); pNew->zFilename = (char*)&pNew[1]; @@ -5059,9 +5059,8 @@ static int unixShmOpen( /* Jump here on any error */ shm_open_err: - unixShmPurge(); + unixShmPurge(); /* This call frees pFile if required */ sqlite3_free(p); - sqlite3_free(pFile); sqlite3_free(pNew); *pShm = 0; unixLeaveMutex(); @@ -592,25 +592,29 @@ int sqlite3WalOpen( *ppWal = 0; nWal = strlen(zDb); pRet = (Wal*)sqlite3MallocZero(sizeof(Wal) + pVfs->szOsFile + nWal+5); - if( !pRet ) goto wal_open_out; + if( !pRet ){ + return SQLITE_NOMEM; + } + pRet->pVfs = pVfs; pRet->pFd = (sqlite3_file *)&pRet[1]; pRet->zName = zWal = pVfs->szOsFile + (char*)pRet->pFd; sqlite3_snprintf(nWal+5, zWal, "%s-wal", zDb); rc = pVfs->xShmOpen(pVfs, zWal, &pRet->pWIndex); - if( rc ) goto wal_open_out; /* Open file handle on the write-ahead log file. */ - flags = (SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_MAIN_JOURNAL); - rc = sqlite3OsOpen(pVfs, zWal, pRet->pFd, flags, &flags); + if( rc==SQLITE_OK ){ + flags = (SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_MAIN_JOURNAL); + rc = sqlite3OsOpen(pVfs, zWal, pRet->pFd, flags, &flags); + } -wal_open_out: if( rc!=SQLITE_OK ){ if( pRet ){ pVfs->xShmClose(pVfs, pRet->pWIndex, 0); sqlite3OsClose(pRet->pFd); sqlite3_free(pRet); } + pRet = 0; } *ppWal = pRet; return rc; @@ -666,26 +670,26 @@ static WalIterator *walIteratorInit(Wal *pWal){ nByte = sizeof(WalIterator) + (nSegment-1)*sizeof(struct WalSegment) + 512; p = (WalIterator *)sqlite3_malloc(nByte); + if( p ){ memset(p, 0, nByte); p->nSegment = nSegment; - p->nFinal = nFinal; - } - for(i=0; i<nSegment-1; i++){ - p->aSegment[i].aDbPage = &aData[walIndexEntry(i*256+1)]; - p->aSegment[i].aIndex = (u8 *)&aData[walIndexEntry(i*256+1)+256]; - } - pFinal = &p->aSegment[nSegment-1]; - - pFinal->aDbPage = &aData[walIndexEntry((nSegment-1)*256+1)]; - pFinal->aIndex = (u8 *)&pFinal[1]; - aTmp = &pFinal->aIndex[256]; - for(i=0; i<nFinal; i++){ - pFinal->aIndex[i] = i; + for(i=0; i<nSegment-1; i++){ + p->aSegment[i].aDbPage = &aData[walIndexEntry(i*256+1)]; + p->aSegment[i].aIndex = (u8 *)&aData[walIndexEntry(i*256+1)+256]; + } + pFinal = &p->aSegment[nSegment-1]; + + pFinal->aDbPage = &aData[walIndexEntry((nSegment-1)*256+1)]; + pFinal->aIndex = (u8 *)&pFinal[1]; + aTmp = &pFinal->aIndex[256]; + for(i=0; i<nFinal; i++){ + pFinal->aIndex[i] = i; + } + walMergesort8(pFinal->aDbPage, aTmp, pFinal->aIndex, &nFinal); + p->nFinal = nFinal; } - walMergesort8(pFinal->aDbPage, aTmp, pFinal->aIndex, &nFinal); - p->nFinal = nFinal; return p; } |