Hey Joe, Which screen version are you using? Try compiling from master, the issue should be solved there.
-David El sáb., 6 jun. 2020 0:39, Joe Yeung <joe.a.ye...@gmail.com> escribió: > Hi, > > I am using screen to connect to /dev/pts/X which is mapped to a VM's > serial port using QEMU. > The first time I connect to it, as a non-privilege user, the connection > went through. > > However, if I connect to it again, screen immediately exists with the > "screen is terminating" message. The only way around it is sudo. > > I notice also that if the first connection is with sudo, subsequent > connections as a non-privilege user also failed. > > It is as if the /dev/pts/X port was put into a wrong state after initial > connection closes. > > So I re-compiled with debug turned on which led me to this function where > the difference is made between the initial and the subsequent connection. > > int secopen(char *name, int flags, int mode) > { > int fd; > > xseteuid(real_uid); > xsetegid(real_gid); > fd = open(name, flags, mode); > xseteuid(eff_uid); > xsetegid(eff_gid); > return fd; > } > > > The very first time I connection, open() succeeded, but subsequent ones > always return -1 with the errno of EBUSY, but I don't see anything > holding the file in lsof. > The open() API was called with the same arguments every time, so why the > different result? > I also tried using strace, but I don't see differences between the first > working connection and the subsequent failing connections. > > One thing I couldn't understand is why we seteuid to real uid before > opening /dev/pts/X and reset it to effective uid afterwards? Should it be > the other way around? Set to effective uid first then reset to the real uid > ?? However, this logic had been there for 5 years.. The secfopen() API also > has similar logic - set to real uid and reset to effective uid. > > I took a stab and swap the seteuid order and it worked. > > Is there a reason why /dev/pts/X can only be opened by a non-privilege > user once? > Am I running into a 5 years old bug? > > thanks! >