Currently, create_lock_obj() can create multiple locks with the same lock range that have different version number. However, lf_setlock() and lf_clearlock() cannot handle this case appropriately. With this patch, make lf_setlock() and lf_clearlock() find overlap again even when ovcase = 1 (lock and overlap have the same lock range).
Addresses: https://cygwin.com/pipermail/cygwin/2024-November/256750.html Fixes: 2e560a092c1c ("* flock.cc (LOCK_OBJ_NAME_LEN): Change to accommodate extra lf_ver field.") Reported-by: Sebastian Feld <sebastian.n.f...@gmail.com> Reviewed-by: Signed-off-by: Takashi Yano <takashi.y...@nifty.ne.jp> --- winsup/cygwin/flock.cc | 16 +++++----------- winsup/cygwin/release/3.5.5 | 3 +++ 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/winsup/cygwin/flock.cc b/winsup/cygwin/flock.cc index 794e66bd7..7a4c16313 100644 --- a/winsup/cygwin/flock.cc +++ b/winsup/cygwin/flock.cc @@ -1411,11 +1411,10 @@ lf_setlock (lockf_t *lock, inode_t *node, lockf_t **clean, HANDLE fhdl) if (lock_cnt > MAX_LOCKF_CNT - room_for_clearlock) return ENOLCK; lf_wakelock (overlap, fhdl); - overlap->lf_type = lock->lf_type; - overlap->create_lock_obj (); - lock->lf_next = *clean; - *clean = lock; - break; + *prev = overlap->lf_next; + overlap->lf_next = *clean; + *clean = overlap; + continue; case 2: /* overlap contains lock */ /* @@ -1562,12 +1561,6 @@ lf_clearlock (lockf_t *unlock, lockf_t **clean, HANDLE fhdl) switch (ovcase) { - case 1: /* overlap == lock */ - *prev = overlap->lf_next; - overlap->lf_next = *clean; - *clean = overlap; - break; - case 2: /* overlap contains lock: split it */ if (overlap->lf_start == unlock->lf_start) { @@ -1582,6 +1575,7 @@ lf_clearlock (lockf_t *unlock, lockf_t **clean, HANDLE fhdl) overlap->lf_next->create_lock_obj (); break; + case 1: /* overlap == lock */ case 3: /* lock contains overlap */ *prev = overlap->lf_next; lf = overlap->lf_next; diff --git a/winsup/cygwin/release/3.5.5 b/winsup/cygwin/release/3.5.5 index a4817df46..115496c18 100644 --- a/winsup/cygwin/release/3.5.5 +++ b/winsup/cygwin/release/3.5.5 @@ -36,3 +36,6 @@ Fixes: - Fix access violation in lf_clearlock() called from flock(). Addresses: https://cygwin.com/pipermail/cygwin/2024-November/256750.html + +-Fix NtCreateEvent() error in create_lock_ob() called from flock(). + Addresses: https://cygwin.com/pipermail/cygwin/2024-November/256750.html -- 2.45.1