mirror of
				https://github.com/isar/libmdbx.git
				synced 2025-10-31 03:29:01 +08:00 
			
		
		
		
	mdbx: устранение null-dereference регресса в режиме readonly-without-lck.
This commit is contained in:
		| @@ -823,10 +823,11 @@ MDBX_INTERNAL void lck_rdt_unlock(MDBX_env *env) { | |||||||
|  |  | ||||||
| int lck_txn_lock(MDBX_env *env, bool dont_wait) { | int lck_txn_lock(MDBX_env *env, bool dont_wait) { | ||||||
|   TRACE("%swait %s", dont_wait ? "dont-" : "", ">>"); |   TRACE("%swait %s", dont_wait ? "dont-" : "", ">>"); | ||||||
|  |   eASSERT(env, env->basal_txn || (env->lck == lckless_stub(env) && (env->flags & MDBX_RDONLY))); | ||||||
|   jitter4testing(true); |   jitter4testing(true); | ||||||
|   const int err = osal_ipclock_lock(env, &env->lck->wrt_lock, dont_wait); |   const int err = osal_ipclock_lock(env, &env->lck->wrt_lock, dont_wait); | ||||||
|   int rc = err; |   int rc = err; | ||||||
|   if (likely(!MDBX_IS_ERROR(err))) { |   if (likely(env->basal_txn && !MDBX_IS_ERROR(err))) { | ||||||
|     eASSERT(env, !env->basal_txn->owner || err == /* если другой поток в этом-же процессе завершился |     eASSERT(env, !env->basal_txn->owner || err == /* если другой поток в этом-же процессе завершился | ||||||
|                                                      не освободив блокировку */ |                                                      не освободив блокировку */ | ||||||
|                                                MDBX_RESULT_TRUE); |                                                MDBX_RESULT_TRUE); | ||||||
| @@ -839,8 +840,12 @@ int lck_txn_lock(MDBX_env *env, bool dont_wait) { | |||||||
|  |  | ||||||
| void lck_txn_unlock(MDBX_env *env) { | void lck_txn_unlock(MDBX_env *env) { | ||||||
|   TRACE("%s", ">>"); |   TRACE("%s", ">>"); | ||||||
|   eASSERT(env, env->basal_txn->owner == osal_thread_self()); |   if (env->basal_txn) { | ||||||
|   env->basal_txn->owner = 0; |     eASSERT(env, !env->basal_txn || env->basal_txn->owner == osal_thread_self()); | ||||||
|  |     env->basal_txn->owner = 0; | ||||||
|  |   } else { | ||||||
|  |     eASSERT(env, env->lck == lckless_stub(env) && (env->flags & MDBX_RDONLY)); | ||||||
|  |   } | ||||||
|   int err = osal_ipclock_unlock(env, &env->lck->wrt_lock); |   int err = osal_ipclock_unlock(env, &env->lck->wrt_lock); | ||||||
|   TRACE("<< err %d", err); |   TRACE("<< err %d", err); | ||||||
|   if (unlikely(err != MDBX_SUCCESS)) |   if (unlikely(err != MDBX_SUCCESS)) | ||||||
|   | |||||||
| @@ -503,7 +503,7 @@ int txn_renew(MDBX_txn *txn, unsigned flags) { | |||||||
|       txn->flags = MDBX_TXN_RDONLY | MDBX_TXN_FINISHED; |       txn->flags = MDBX_TXN_RDONLY | MDBX_TXN_FINISHED; | ||||||
|       return MDBX_SUCCESS; |       return MDBX_SUCCESS; | ||||||
|     } |     } | ||||||
|     txn->owner = (uintptr_t)r->tid.weak; |     txn->owner = likely(r) ? (uintptr_t)r->tid.weak : ((env->flags & MDBX_NOSTICKYTHREADS) ? 0 : osal_thread_self()); | ||||||
|     if ((env->flags & MDBX_NOSTICKYTHREADS) == 0 && env->txn && unlikely(env->basal_txn->owner == txn->owner) && |     if ((env->flags & MDBX_NOSTICKYTHREADS) == 0 && env->txn && unlikely(env->basal_txn->owner == txn->owner) && | ||||||
|         (globals.runtime_flags & MDBX_DBG_LEGACY_OVERLAP) == 0) |         (globals.runtime_flags & MDBX_DBG_LEGACY_OVERLAP) == 0) | ||||||
|       return MDBX_TXN_OVERLAPPING; |       return MDBX_TXN_OVERLAPPING; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user