Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Hang in E01 due to zpty on OpenBSD
- X-seq: zsh-workers 49980
- From: Matthew Martin <phy1729@xxxxxxxxx>
- To: zsh-workers@xxxxxxx
- Subject: Re: Hang in E01 due to zpty on OpenBSD
- Date: Sun, 3 Apr 2022 21:34:07 -0500
- Archived-at: <https://zsh.org/workers/49980>
- In-reply-to: <CAH+w=7ba1fo9BdNurD9TH5MjuyYRk=-xJ0ioXo8aTt_ZCKEhLw@mail.gmail.com>
- List-id: <zsh-workers.zsh.org>
- Mail-followup-to: zsh-workers@xxxxxxx
- References: <YkoUwETgsrrqDeZN@CptOrmolo.darkstar> <CAH+w=7ba1fo9BdNurD9TH5MjuyYRk=-xJ0ioXo8aTt_ZCKEhLw@mail.gmail.com>
On Sun, Apr 03, 2022 at 06:04:30PM -0700, Bart Schaefer wrote:
> On Sun, Apr 3, 2022 at 2:43 PM Matthew Martin <phy1729@xxxxxxxxx> wrote:
> >
> > I assume the EPERM on open is an OpenBSD bug, but zsh should probably
> > not hang either.
>
> I'm not sure what could be done about this from the zsh code. The
> only reasonable assumption for the pty master-side reader is that the
> slave-slide will become closed upon an error and the read will fail.
> Using a non-blocking read would defeat the purpose.
The only reasonable thing I can come up with is open both pty and tty on
the first call to get_pty, so the second call can't fail.
The tests pass when I use openpty; though since that's in libutil and
I didn't immedietly see a way to link that in, there's a terrible work
around with dlopen/dlsym. I have no intention to commit this.
I've sent a mail to OpenBSD. I don't think this should block the
release. Worst case there will be a patch in the port that can be
upstreamed by the next release.
diff --git a/Src/Modules/zpty.c b/Src/Modules/zpty.c
index dfd2a2a7a..3f21c2b89 100644
--- a/Src/Modules/zpty.c
+++ b/Src/Modules/zpty.c
@@ -37,6 +37,12 @@
#endif
#endif
+#ifdef __OpenBSD__
+#include <dlfcn.h>
+#include <termios.h>
+#include <util.h>
+#endif
+
/* The number of bytes we normally read when given no pattern and the
* upper bound on the number of bytes we read (even if we are give a
* pattern). */
@@ -161,8 +167,38 @@ getptycmd(char *name)
return NULL;
}
-/* posix_openpt() seems to have some problem on OpenBSD */
-#if defined(USE_DEV_PTMX) && !defined(__OpenBSD__)
+#if defined(__OpenBSD__)
+
+static int
+get_pty(int master, int *retfd)
+{
+ static int mfd, sfd;
+
+ if (master) {
+ void *handle;
+ int (*openpty)(int *, int *, char *, struct termios *, struct winsize *);
+
+ if ((handle = dlopen("libutil.so", 0)) == NULL) {
+ return 1;
+ }
+ if ((openpty = dlsym(handle, "openpty")) == NULL) {
+ dlclose(handle);
+ return 1;
+ }
+ if (openpty(&mfd, &sfd, NULL, NULL, NULL) == -1) {
+ dlclose(handle);
+ return 1;
+ }
+ dlclose(handle);
+ *retfd = mfd;
+ return 0;
+ }
+
+ *retfd = sfd;
+ return 0;
+}
+
+#elif defined(USE_DEV_PTMX)
#ifdef HAVE_SYS_STROPTS_H
#include <sys/stropts.h>
@@ -261,12 +297,7 @@ get_pty(int master, int *retfd)
#elif defined(__FreeBSD__) || defined(__DragonFly__)
static char char1[] = "pqrsPQRS";
static char char2[] = "0123456789abcdefghijklmnopqrstuv";
-#elif defined(__OpenBSD__)
- static char char1[] = "pqrstuvwxyzPQRST";
- static char char2[] = "0123456789"
- "abcdefghijklmnopqrstuvwxyz"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-#else /* __FreeBSD__ || __DragonFly__ || __OpenBSD*/
+#else /* __FreeBSD__ || __DragonFly__ */
static char char1[] = "pqrstuvwxyzPQRST";
static char char2[] = "0123456789abcdef";
#endif
Messages sorted by:
Reverse Date,
Date,
Thread,
Author