From 2b115069c14026baccfea3886c3b34d73c200a22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Mon, 14 Jul 2025 16:03:12 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20resurrect-after-fork=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B8=20SysV-=D1=81=D0=B5=D0=BC=D0=B0?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BE=D0=B2=20(`MDBX=5FLOCKING=3D5`).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ошибка/недоработка была с первой реализации resurrect-after-fork в ноябре 2023, но оставалась не замеченной из-за отсутствия CI-тестирования на платформе OSX/Mac (где нет поддержки разделяемых мьютексов). --- src/lck-posix.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lck-posix.c b/src/lck-posix.c index 8586315b..584df277 100644 --- a/src/lck-posix.c +++ b/src/lck-posix.c @@ -457,6 +457,10 @@ __cold MDBX_INTERNAL int lck_destroy(MDBX_env *env, MDBX_env *inprocess_neighbor jitter4testing(false); } +#if MDBX_LOCKING == MDBX_LOCKING_SYSV + env->me_sysv_ipc.semid = -1; +#endif /* MDBX_LOCKING */ + if (current_pid != env->pid) { eASSERT(env, !inprocess_neighbor); NOTICE("drown env %p after-fork pid %d -> %d", __Wpedantic_format_voidptr(env), env->pid, current_pid); @@ -773,14 +777,14 @@ static int osal_ipclock_lock(MDBX_env *env, osal_ipclock_t *ipc, const bool dont return rc; } -int osal_ipclock_unlock(MDBX_env *env, osal_ipclock_t *ipc) { +static int osal_ipclock_unlock(MDBX_env *env, osal_ipclock_t *ipc) { int err = MDBX_ENOSYS; #if MDBX_LOCKING == MDBX_LOCKING_POSIX2001 || MDBX_LOCKING == MDBX_LOCKING_POSIX2008 err = pthread_mutex_unlock(ipc); #elif MDBX_LOCKING == MDBX_LOCKING_POSIX1988 err = sem_post(ipc) ? errno : MDBX_SUCCESS; #elif MDBX_LOCKING == MDBX_LOCKING_SYSV - if (unlikely(*ipc != (pid_t)env->pid)) + if (unlikely(*ipc != (pid_t)env->pid || env->me_sysv_ipc.key == -1)) err = EPERM; else { *ipc = 0;