فهرست منبع

block pthread cancellation in openpty function

being a nonstandard function, this isn't strictly necessary, but it's
inexpensive and avoids unpleasant surprises. eventually I would like
all functions in libc to be safe against cancellation, either ignoring
it or acting on it cleanly.
Rich Felker 10 سال پیش
والد
کامیت
1227e418ea
1فایلهای تغییر یافته به همراه14 افزوده شده و 9 حذف شده
  1. 14 9
      src/misc/openpty.c

+ 14 - 9
src/misc/openpty.c

@@ -3,33 +3,38 @@
 #include <unistd.h>
 #include <pty.h>
 #include <stdio.h>
+#include <pthread.h>
 
 /* Nonstandard, but vastly superior to the standard functions */
 
 int openpty(int *pm, int *ps, char *name, const struct termios *tio, const struct winsize *ws)
 {
-	int m, s, n=0;
+	int m, s, n=0, cs;
 	char buf[20];
 
 	m = open("/dev/ptmx", O_RDWR|O_NOCTTY);
 	if (m < 0) return -1;
 
-	if (ioctl(m, TIOCSPTLCK, &n) || ioctl (m, TIOCGPTN, &n)) {
-		close(m);
-		return -1;
-	}
+	pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+
+	if (ioctl(m, TIOCSPTLCK, &n) || ioctl (m, TIOCGPTN, &n))
+		goto fail;
 
 	if (!name) name = buf;
 	snprintf(name, sizeof buf, "/dev/pts/%d", n);
-	if ((s = open(name, O_RDWR|O_NOCTTY)) < 0) {
-		close(m);
-		return -1;
-	}
+	if ((s = open(name, O_RDWR|O_NOCTTY)) < 0)
+		goto fail;
 
 	if (tio) tcsetattr(s, TCSANOW, tio);
 	if (ws) ioctl(s, TIOCSWINSZ, ws);
 
 	*pm = m;
 	*ps = s;
+
+	pthread_setcancelstate(cs, 0);
 	return 0;
+fail:
+	close(m);
+	pthread_setcancelstate(cs, 0);
+	return -1;
 }