Fix a race condition during hot-journal rollback that could theoretically cause spurious corruption errors.
FossilOrigin-Name: 20ea53ddf590a9dd19501fabd2bfdb9c10b5eb265cd2995bdb335769c936c763
This commit is contained in:
+5
-6
@@ -1652,7 +1652,7 @@ static int unixFileLock(unixFile *pFile, struct flock *pLock){
|
||||
** UNLOCKED -> SHARED
|
||||
** SHARED -> RESERVED
|
||||
** SHARED -> (PENDING) -> EXCLUSIVE
|
||||
** RESERVED -> (PENDING) -> EXCLUSIVE
|
||||
** RESERVED -> EXCLUSIVE
|
||||
** PENDING -> EXCLUSIVE
|
||||
**
|
||||
** This routine will only increase a lock. Use the sqlite3OsUnlock()
|
||||
@@ -1767,7 +1767,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){
|
||||
lock.l_len = 1L;
|
||||
lock.l_whence = SEEK_SET;
|
||||
if( eFileLock==SHARED_LOCK
|
||||
|| (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLock<PENDING_LOCK)
|
||||
|| (eFileLock==EXCLUSIVE_LOCK && pFile->eFileLock==RESERVED_LOCK)
|
||||
){
|
||||
lock.l_type = (eFileLock==SHARED_LOCK?F_RDLCK:F_WRLCK);
|
||||
lock.l_start = PENDING_BYTE;
|
||||
@@ -1778,6 +1778,9 @@ static int unixLock(sqlite3_file *id, int eFileLock){
|
||||
storeLastErrno(pFile, tErrno);
|
||||
}
|
||||
goto end_lock;
|
||||
}else if( eFileLock==EXCLUSIVE_LOCK ){
|
||||
pFile->eFileLock = PENDING_LOCK;
|
||||
pInode->eFileLock = PENDING_LOCK;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1865,13 +1868,9 @@ static int unixLock(sqlite3_file *id, int eFileLock){
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
if( rc==SQLITE_OK ){
|
||||
pFile->eFileLock = eFileLock;
|
||||
pInode->eFileLock = eFileLock;
|
||||
}else if( eFileLock==EXCLUSIVE_LOCK ){
|
||||
pFile->eFileLock = PENDING_LOCK;
|
||||
pInode->eFileLock = PENDING_LOCK;
|
||||
}
|
||||
|
||||
end_lock:
|
||||
|
||||
+4
-1
@@ -485,6 +485,9 @@ static int tvfsLock(sqlite3_file *pFile, int eLock){
|
||||
tvfsExecTcl(p, "xLock", Tcl_NewStringObj(pFd->zFilename, -1),
|
||||
Tcl_NewStringObj(zLock, -1), 0, 0);
|
||||
}
|
||||
if( p->mask&TESTVFS_LOCK_MASK && tvfsInjectIoerr(p) ){
|
||||
return SQLITE_IOERR_LOCK;
|
||||
}
|
||||
return sqlite3OsLock(pFd->pReal, eLock);
|
||||
}
|
||||
|
||||
@@ -500,7 +503,7 @@ static int tvfsUnlock(sqlite3_file *pFile, int eLock){
|
||||
tvfsExecTcl(p, "xUnlock", Tcl_NewStringObj(pFd->zFilename, -1),
|
||||
Tcl_NewStringObj(zLock, -1), 0, 0);
|
||||
}
|
||||
if( p->mask&TESTVFS_WRITE_MASK && tvfsInjectIoerr(p) ){
|
||||
if( p->mask&TESTVFS_UNLOCK_MASK && tvfsInjectIoerr(p) ){
|
||||
return SQLITE_IOERR_UNLOCK;
|
||||
}
|
||||
return sqlite3OsUnlock(pFd->pReal, eLock);
|
||||
|
||||
Reference in New Issue
Block a user