diff Modules/socketmodule.c @ 10441:9ba5dffccb1b legacy-trunk

Jonathan Giddy writes: Here's a patch to fix the race condition, which wasn't fixed by Rob's patch. It holds the gethostbyname lock until the results are copied out, which means that this lock and the Python global lock are held at the same time. This shouldn't be a problem as long as the gethostbyname lock is always acquired when the global lock is not held.
author Guido van Rossum <guido@python.org>
date Mon, 22 Mar 1999 20:14:53 +0000
parents f81db738abd9
children 9184c9e108f9
line wrap: on
line diff
--- a/Modules/socketmodule.c	Mon Mar 22 19:25:30 1999 +0000
+++ b/Modules/socketmodule.c	Mon Mar 22 20:14:53 1999 +0000
@@ -328,6 +328,7 @@
 {
 	struct hostent *hp;
 	int d1, d2, d3, d4;
+	int h_length;
 	char ch;
 #ifdef HAVE_GETHOSTBYNAME_R
 	struct hostent hp_allocated;
@@ -368,9 +369,6 @@
 	PyThread_acquire_lock(gethostbyname_lock,1);
 #endif
 	hp = gethostbyname(name);
-#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
-	PyThread_release_lock(gethostbyname_lock);
-#endif
 #endif /* HAVE_GETHOSTBYNAME_R */
 	Py_END_ALLOW_THREADS
 
@@ -382,10 +380,17 @@
 #else
 		PyErr_SetString(PySocket_Error, "host not found");
 #endif
+#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
+		PyThread_release_lock(gethostbyname_lock);
+#endif
 		return -1;
 	}
 	memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length);
-	return hp->h_length;
+	h_length = hp->h_length;
+#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
+	PyThread_release_lock(gethostbyname_lock);
+#endif
+	return h_length;
 }
 
 
@@ -1409,6 +1414,7 @@
 	char *name;
 	struct hostent *h;
 	struct sockaddr_in addr;
+	PyObject *ret;
 #ifdef HAVE_GETHOSTBYNAME_R
 	struct hostent hp_allocated;
 	char buf[16384];
@@ -1434,12 +1440,13 @@
 	PyThread_acquire_lock(gethostbyname_lock,1);
 #endif
 	h = gethostbyname(name);
-#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
+#endif /* HAVE_GETHOSTBYNAME_R */
+	Py_END_ALLOW_THREADS
+	ret = gethost_common(h,&addr);
+#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
 	PyThread_release_lock(gethostbyname_lock);
 #endif
-#endif /* HAVE_GETHOSTBYNAME_R */
-	Py_END_ALLOW_THREADS
-	return gethost_common(h,&addr);
+	return ret;
 }
 
 static char ghbn_ex_doc[] =