diff Modules/socketmodule.c @ 55627:fbf8b791ce81 legacy-trunk

Fix issue1628205: Socket file objects returned by socket.socket.makefile() now properly handles EINTR within the read, readline, write & flush methods. The socket.sendall() method now properly handles interrupted system calls.
author Gregory P. Smith <greg@mad-scientist.com>
date Thu, 13 Aug 2009 18:54:50 +0000
parents 87171283d02f
children 6a278e4d9f61
line wrap: on
line diff
--- a/Modules/socketmodule.c	Thu Aug 13 12:57:25 2009 +0000
+++ b/Modules/socketmodule.c	Thu Aug 13 18:54:50 2009 +0000
@@ -2736,8 +2736,21 @@
 #else
 		n = send(s->sock_fd, buf, len, flags);
 #endif
-		if (n < 0)
+		if (n < 0) {
+#ifdef EINTR
+			/* We must handle EINTR here as there is no way for
+			 * the caller to know how much was sent otherwise.  */
+			if (errno == EINTR) {
+				/* Run signal handlers.  If an exception was
+				 * raised, abort and leave this socket in
+				 * an unknown state. */
+				if (PyErr_CheckSignals())
+					return NULL;
+				continue;
+			}
+#endif
 			break;
+		}
 		buf += n;
 		len -= n;
 	} while (len > 0);