zsh is nearing a release and since OpenBSD is too, I thought I'd get
some early testing in. (Though at this point the timing won't work out.)
A pty test has been failing for a while, but a newly added test is now
hanging on [1]
        ret = read(master, &syncch, 1);

I believe the root cause basically boils down to opening /dev/ptyxx for
some xx and then opening the corresponding /dev/ttyxx fails for _pbuild
but not as my user. The below code runs for me, but fails when run under
_pbuild.

Normally I'd try to dig further, but I don't know if I'll have time
before it's too late for the release.

1: 
https://github.com/zsh-users/zsh/blob/29f97c1f9447335c8f088f1cf809d90004e78053/Src/Modules/zpty.c#L473


% ./a.out                        
3: /dev/ptyp5
4: /dev/ttyp5
% doas -u _pbuild ./a.out        
3: /dev/ptyp5
a.out: open: Permission denied


#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

static int
get_pty(char *path) {
        const char char1[] = "pqrstuvwxyzPQRST";
        const char char2[] = "0123456789"
            "abcdefghijklmnopqrstuvwxyz"
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        const char *p1, *p2;
        int fd;

        strcpy(path, "/dev/ptyxx");

        for (p1 = char1; *p1; p1++) {
                path[8] = *p1;
                for (p2 = char2; *p2; p2++) {
                        path[9] = *p2;
                        if ((fd = open(path, O_RDWR|O_NOCTTY)) >= 0) {
                                return fd;
                        }
                }
        }

        return -1;
}

int
main() {
        char path[11];
        int ptyfd, ttyfd;

        if ((ptyfd = get_pty(path)) == -1) {
                err(1, "get_pty");
        }
        printf("%d: %s\n", ptyfd, path);

        path[5] = 't';
        if ((ttyfd = open(path, O_RDWR|O_NOCTTY)) == -1) {
                err(1, "open");
        }
        printf("%d: %s\n", ttyfd, path);
}

Reply via email to