]> granicus.if.org Git - python/commitdiff
Jonathan Giddy writes:
authorGuido van Rossum <guido@python.org>
Mon, 22 Mar 1999 20:14:53 +0000 (20:14 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 22 Mar 1999 20:14:53 +0000 (20:14 +0000)
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.

Modules/socketmodule.c

index 8b087d2ce126630b9b21351a345fb2834296a78e..da1d223997bd74ae8369d9c1d0c97170bc2ec224 100644 (file)
@@ -328,6 +328,7 @@ BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
 {
        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 @@ BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
        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
 
@@ -381,11 +379,18 @@ BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
                PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
 #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 @@ BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
        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 @@ BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
        PyThread_acquire_lock(gethostbyname_lock,1);
 #endif
        h = gethostbyname(name);
-#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
-       PyThread_release_lock(gethostbyname_lock);
-#endif
 #endif /* HAVE_GETHOSTBYNAME_R */
        Py_END_ALLOW_THREADS
-       return gethost_common(h,&addr);
+       ret = gethost_common(h,&addr);
+#if defined(WITH_THREAD) && !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
+       PyThread_release_lock(gethostbyname_lock);
+#endif
+       return ret;
 }
 
 static char ghbn_ex_doc[] =