Loading...
threads/cprocs.c Libc-583 Libc-825.26
--- Libc/Libc-583/threads/cprocs.c
+++ Libc/Libc-825.26/threads/cprocs.c
@@ -140,18 +140,24 @@
 extern int __pthread_canceled(int);
 
 void
-cthread_set_errno_self(error)
-	int	error;
+cthread_set_errno_self(int error, int nocancel)
 {
 	int *ep = __error();
 	extern int __unix_conforming;
+	pthread_t self = NULL;
+	int check_cancel = __unix_conforming && !nocancel;
 
-	if ((__unix_conforming) && (error == EINTR) && (__pthread_canceled(0) == 0))
+	if (check_cancel && ((error & 0xff) == EINTR) && (__pthread_canceled(0) == 0)) {
+		self = pthread_self();
+		if (self != NULL)
+			self->cancel_error = error;
 		pthread_exit(PTHREAD_CANCELED);
+	}
 
-        if (ep != &errno)
-            *ep = error;
+	if (ep != &errno) {
+		*ep = error;
+	}
 
-        errno = error;
+	errno = error;
 }