Skip to content

[BACKPORT] Cygwin: open: Unlock fdtab before open_with_arch()#350

Open
lazka wants to merge 1 commit into
msys2:msys2-3.6.10from
lazka:fifo-backport
Open

[BACKPORT] Cygwin: open: Unlock fdtab before open_with_arch()#350
lazka wants to merge 1 commit into
msys2:msys2-3.6.10from
lazka:fifo-backport

Conversation

@lazka

@lazka lazka commented Jul 19, 2026

Copy link
Copy Markdown
Member

Since the commit 31bf91f, opening fifo causes a deadlock. This is because, open_with_arch() for fifo can be blocked until the other side of the fifo is opened. The commit 31bf91f moves the creating cygheap_fdnew before open_with_arch() to address the issue: https://cygwin.com/pipermail/cygwin/2026-May/259664.html However, cygheap_fdnew locks fdtab, so open() for the other side of fifo cannot create cygheap_fdnew until fdtab is unlocked. This is the cause of the deadlock.

With this patch, fdtab is unlocked before open_with_arch(), but marked as used using tentative fhandler. The summary of open() is as follows.

  1. Lock fdtab.
  2. Create new fd.
  3. Mark fd as used using tentative fhandler.
  4. Unlock fdtab.
  5. Call open_with_arch().
  6. Set final fhandler to fd.

The important point is that create fd before open_with_arch() to address https://cygwin.com/pipermail/cygwin/2026-May/259664.html, but unlock fdtab before open_with_arch() to address https://cygwin.com/pipermail/cygwin/2026-July/259884.html.

Fixes: 31bf91f ("Cygwin: Ensure unused fd available for open()")
Addresses: https://cygwin.com/pipermail/cygwin/2026-July/259884.html
Reported-by: kikairoya kikairoya@gmail.com

Reviewed-by: Mark Geisert mark@maxrnd.com
(cherry picked from commit 524d75f)

@dscho dscho left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While I have some (not yet sent) concerns about that patch which will probably require follow-up fixes, it has been pushed to cygwin/master already, and therefore is appropriate to backport as-is.

Comment thread winsup/cygwin/release/3.6.11 Outdated
Since the commit 31bf91f, opening fifo causes a deadlock. This
is because, open_with_arch() for fifo can be blocked until the other
side of the fifo is opened. The commit 31bf91f moves the creating
cygheap_fdnew before open_with_arch() to address the issue:
https://cygwin.com/pipermail/cygwin/2026-May/259664.html
However, cygheap_fdnew locks fdtab, so open() for the other side of
fifo cannot create cygheap_fdnew until fdtab is unlocked. This is
the cause of the deadlock.

With this patch, fdtab is unlocked before open_with_arch(), but marked
as used using tentative fhandler. The summary of open() is as follows.
 1) Lock fdtab.
 2) Create new fd.
 3) Mark fd as used using tentative fhandler.
 4) Unlock fdtab.
 5) Call open_with_arch().
 6) Set final fhandler to fd.

The important point is that create fd before open_with_arch() to
address https://cygwin.com/pipermail/cygwin/2026-May/259664.html,
but unlock fdtab before open_with_arch() to address
https://cygwin.com/pipermail/cygwin/2026-July/259884.html.

Fixes: 31bf91f ("Cygwin: Ensure unused fd available for open()")
Addresses: https://cygwin.com/pipermail/cygwin/2026-July/259884.html
Reported-by: kikairoya <kikairoya@gmail.com>
Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
Reviewed-by: Mark Geisert <mark@maxrnd.com>
(cherry picked from commit 524d75f)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants