[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: vim testsuite: Test_keep_pty_open V2
From: |
Zhaoming Luo |
Subject: |
Re: vim testsuite: Test_keep_pty_open V2 |
Date: |
Sat, 8 Feb 2025 12:51:04 +0800 |
On Sat, Feb 08, 2025 at 08:55:31AM +0800, Zhaoming Luo wrote:
> On Fri, Feb 07, 2025 at 01:57:01PM +0100, Samuel Thibault wrote:
> > Zhaoming Luo, le ven. 07 févr. 2025 18:44:50 +0800, a ecrit:
> > > This is V2 of figuring out the issue. V1 is abandoned due to my mistake,
> > > but this time I can confirm the source of issue. This time I ran
> > > rpctrace directly on vim, and used two printfs to locate the isatty().
> > >
> > > ```
> > > printf ("Start isatty!\n");
> > > if (mch_isatty(in))
> > > channel->ch_to_be_closed |= (1U << PART_IN);
> > > printf ("Finish isatty!\n");
> > > ```
> > >
> > > rpctrace output:
> > > ```
> > > ...
> > > 30<--44(pid920)->io_write_request ("Start isatty!\n" -1) = 0 14
> > > 56<--24(pid920)->term_getctty () = 0x4000002d (Operation not supported)
> > > 30<--44(pid920)->io_write_request ("Finish isatty!\n" -1) = 0 15
> > > ...
> > > ```
> > >
> > > The error seems to be from [2].
> >
> > Indeed, if it was plugged to another translator you'd get a mig bad id
> > error.
> >
> > My guess is that it's cred->pi.class != tty_class that fails, indeed:
> >
> > int ret = openpty(&master, &slave, s, &term, &win);
> > printf("%d\n", isatty(master));
> > printf("%d\n", isatty(slave));
> >
> > says 0 for master on the Hurd while it says 1 on Linux
> >
> > The pi.class != tty_class condition was previously because of a lookup,
> > but nowadays with the protected payloads we didn't need a lookup any
> > more and it was replaced with a check that we find cred in the proper
> > place. I'd say we should also accept the class being pty_class, it
> > does not seem it would harm: in the uses of term_getctty that I can see,
> > it matches the obtained cttyid with the one of the process, or it's an
> > explicit request.
>
> Ok, I will submit a patch so EOPNOSUPP will be returned when
> cred->pi.class != pty_class is also true.
>
I got stuck at the patch since I'm not sure whether I should add a
condition like:
```
if (!cred
|| cred->pi.bucket != term_bucket
- || cred->pi.class != tty_class)
+ || (cred->pi.class != tty_class && cred->pi.class != pty_class))
return EOPNOTSUPP;
```
Or directly remove cred->pi.class != tty_class. Please feel free to
submit the patch, I can confirm that accepting pty_class can pass the
vim test Test_keep_pty_open (and a few other tests \o/).
Zhaoming