screen-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[screen-devel] [bug #61749] pty race between parent and child processes


From: Valery Ushakov
Subject: [screen-devel] [bug #61749] pty race between parent and child processes
Date: Thu, 30 Dec 2021 19:37:57 -0500 (EST)
User-agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0

URL:
  <https://savannah.gnu.org/bugs/?61749>

                 Summary: pty race between parent and child processes
                 Project: GNU Screen
            Submitted by: uwe
            Submitted on: Fri 31 Dec 2021 12:37:55 AM UTC
                Category: Program Logic
                Severity: 3 - Normal
                Priority: 5 - Normal
                  Status: None
                 Privacy: Public
             Assigned to: None
             Open/Closed: Open
                 Release: 4.8.0
         Discussion Lock: Any
           Fixed Release: None
         Planned Release: None
           Work Required: None

    _______________________________________________________

Details:

There seems to be a race between MakeWindow selecting the master side and the
ForkWindow opening the slave side.

On NetBSD (HAVE_SVR4_PTYS):


$ screen -S test -c /dev/null -ln -d -m -p 0 sh; sleep 1; screen -S test -X
quit
No screen session found.


The command sometimes succeeds in creating a session and sometimes not.  When
it fails to create a session, the SCREEN.$$ debug log contains


 + hit ev fd 5 type 1!
going to read from window fd 5
Window 0: EOF (errno 0) - killing window


As far as I can tell what happens that the parent calls select on the master
fd while the child still has not opened the slave side.  NetBSD select/poll
report the fd as readable and the read returns EOF.

Here's a bit of ktrace from a failed attempt:


$ kdump | sed -n -e '/select/p' -e '/EOF/p' \
                 -e '/\/dev\/pts/{' -e 'N' -e '/open/p' -e '}'
  4831   4831 screen   CALL 
__select50(0x100,0x7f7fff3739f0,0x7f7fff373a10,0,0)
  4831   4831 screen   RET   __select50 1
       "Window 0: EOF (errno 0) - killing window\n"
  5218   5218 screen   NAMI  "/dev/pts/7"
  5218   5218 screen   RET   open 0


vs. a successful one:


 19165  19165 screen   CALL 
__select50(0x100,0x7f7fff30a910,0x7f7fff30a930,0,0)
 26839  26839 screen   NAMI  "/dev/pts/7"
 26839  26839 screen   RET   open 0
 19165  19165 screen   RET   __select50 1
       "serv_select_fn called\n"
 19165  19165 screen   CALL 
__select50(0x100,0x7f7fff30a910,0x7f7fff30a930,0,0)
 19165  19165 screen   RET   __select50 1


Using brute-force and setting pty_preopen = 1; in OpenPTY seems to fix it as
the slave side is now always open already when the parent selects on the
master fd.





    _______________________________________________________

Reply to this item at:

  <https://savannah.gnu.org/bugs/?61749>

_______________________________________________
  Message sent via Savannah
  https://savannah.gnu.org/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]