[PATCH 2/2] Cygwin: flock: Fix overlap handling in lf_setlock() and lf_clearlock()
Takashi Yano
takashi.yano@nifty.ne.jp
Fri Nov 15 13:14:11 GMT 2024
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.feld@gmail.com>
Reviewed-by:
Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
---
winsup/cygwin/flock.cc | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/winsup/cygwin/flock.cc b/winsup/cygwin/flock.cc
index 794e66bd7..5f703ad0e 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 */
/*
@@ -1564,9 +1563,11 @@ lf_clearlock (lockf_t *unlock, lockf_t **clean, HANDLE fhdl)
{
case 1: /* overlap == lock */
*prev = overlap->lf_next;
+ lf = overlap->lf_next;
overlap->lf_next = *clean;
*clean = overlap;
- break;
+ first_loop = false;
+ continue;
case 2: /* overlap contains lock: split it */
if (overlap->lf_start == unlock->lf_start)
--
2.45.1
More information about the Cygwin-patches
mailing list