diff options
Diffstat (limited to 'src/test_async.c')
-rw-r--r-- | src/test_async.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/test_async.c b/src/test_async.c index 13138cfb3..f4f564c84 100644 --- a/src/test_async.c +++ b/src/test_async.c @@ -621,13 +621,18 @@ static int getFileLock(AsyncLock *pLock){ assert(eRequired>=0 && eRequired<=SQLITE_LOCK_EXCLUSIVE); } } + if( eRequired>pLock->eLock ){ rc = sqlite3OsLock(pLock->pFile, eRequired); - }else if(eRequired<pLock->eLock){ - rc = sqlite3OsUnlock(pLock->pFile, eRequired); + if( rc==SQLITE_OK ){ + pLock->eLock = eRequired; + } } - if( rc==SQLITE_OK ){ - pLock->eLock = eRequired; + else if( eRequired<pLock->eLock && eRequired<=SQLITE_LOCK_SHARED ){ + rc = sqlite3OsUnlock(pLock->pFile, eRequired); + if( rc==SQLITE_OK ){ + pLock->eLock = eRequired; + } } } @@ -932,11 +937,11 @@ static int asyncFullPathname( /* Replace any occurences of "<path-component>/../" with "" */ if( iOut>0 && iIn<=(nPathOut-4) && zPathOut[iIn]=='/' && zPathOut[iIn+1]=='.' - && zPathOut[iIn+2]=='.' && zPathOut[iIn+2]=='/' + && zPathOut[iIn+2]=='.' && zPathOut[iIn+3]=='/' ){ iIn += 3; iOut--; - for( ; iOut>0 && zPathOut[iOut]!='/'; iOut--); + for( ; iOut>0 && zPathOut[iOut-1]!='/'; iOut--); continue; } |