diff options
author | dan <Dan Kennedy> | 2023-01-31 20:21:06 +0000 |
---|---|---|
committer | dan <Dan Kennedy> | 2023-01-31 20:21:06 +0000 |
commit | ca3aabdf5397b7e47b24b85dc321dc0e8e4ec749 (patch) | |
tree | 53abe45f0ae56fafadbc7c3c0f90bef2def8d108 /src/os_unix.c | |
parent | f7af9ba13cb7ef413c5202d12678a475ed1234c9 (diff) | |
download | sqlite-ca3aabdf5397b7e47b24b85dc321dc0e8e4ec749.tar.gz sqlite-ca3aabdf5397b7e47b24b85dc321dc0e8e4ec749.zip |
Fix a race condition during hot-journal rollback that could theoretically cause spurious corruption errors.
FossilOrigin-Name: 20ea53ddf590a9dd19501fabd2bfdb9c10b5eb265cd2995bdb335769c936c763
Diffstat (limited to 'src/os_unix.c')
-rw-r--r-- | src/os_unix.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/src/os_unix.c b/src/os_unix.c index c3359f1bc..7c1acc816 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -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: |