On Wed, 3 Jun 2020, Joe Yeung wrote:

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.

What is the errno() value? Can you say more about the operating system you
are using?

My host is on FreeBSD 11.x and there I get pseudoterminals and screen 4.7.0.

I did a quick test with "serial=pty" setting on a Xen HVM guest
(which has I/O done with qemu) and noticed the following:

I have /dev/pts/3 available with the console after the machine boots
(available only to root). After the pseudoterminal closes, /dev/pts/3
disappers from the /dev/ tree and an attempt to open it results
in "Permission denied".
But in parallel /dev/pts/4 becomes available. Having that one closed,
/dev/pts/3 appears again.

One more interesting thing: I open screen with

screen /dev/pts/3 115200

to connect to the console of the guest, after this I open another
window to the same terminal with ctrl-A :screen /dev/pts/3 115200

The second window remains mute (no input and output), the first one works. But when I close the first window with the kill
screen command, the second terminal becomes active and /dev/pts/3
does not disappear.

Pseudoterminals are allocated dynamically - maybe if qemu
re-opens the pseudoterminal master it simply gets another terminal
to use?

Marcin

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to