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

Reply via email to