Commit 955becc3 authored by Guido van Rossum's avatar Guido van Rossum

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.
parent 173156fa
...@@ -328,6 +328,7 @@ BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret) ...@@ -328,6 +328,7 @@ BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
{ {
struct hostent *hp; struct hostent *hp;
int d1, d2, d3, d4; int d1, d2, d3, d4;
int h_length;
char ch; char ch;
#ifdef HAVE_GETHOSTBYNAME_R #ifdef HAVE_GETHOSTBYNAME_R
struct hostent hp_allocated; struct hostent hp_allocated;
...@@ -368,9 +369,6 @@ BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret) ...@@ -368,9 +369,6 @@ BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
PyThread_acquire_lock(gethostbyname_lock,1); PyThread_acquire_lock(gethostbyname_lock,1);
#endif #endif
hp = gethostbyname(name); hp = gethostbyname(name);
#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
PyThread_release_lock(gethostbyname_lock);
#endif
#endif /* HAVE_GETHOSTBYNAME_R */ #endif /* HAVE_GETHOSTBYNAME_R */
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
...@@ -381,11 +379,18 @@ BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret) ...@@ -381,11 +379,18 @@ BUILD_FUNC_DEF_2(setipaddr, char*,name, struct sockaddr_in *,addr_ret)
PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno)); PyErr_SetString(PySocket_Error, (char *)hstrerror(h_errno));
#else #else
PyErr_SetString(PySocket_Error, "host not found"); 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 #endif
return -1; return -1;
} }
memcpy((char *) &addr_ret->sin_addr, hp->h_addr, hp->h_length); 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) ...@@ -1409,6 +1414,7 @@ BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
char *name; char *name;
struct hostent *h; struct hostent *h;
struct sockaddr_in addr; struct sockaddr_in addr;
PyObject *ret;
#ifdef HAVE_GETHOSTBYNAME_R #ifdef HAVE_GETHOSTBYNAME_R
struct hostent hp_allocated; struct hostent hp_allocated;
char buf[16384]; char buf[16384];
...@@ -1434,12 +1440,13 @@ BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args) ...@@ -1434,12 +1440,13 @@ BUILD_FUNC_DEF_2(PySocket_gethostbyname_ex,PyObject *,self, PyObject *,args)
PyThread_acquire_lock(gethostbyname_lock,1); PyThread_acquire_lock(gethostbyname_lock,1);
#endif #endif
h = gethostbyname(name); h = gethostbyname(name);
#if defined(WITH_THREAD) && !defined(MS_WINDOWS)
PyThread_release_lock(gethostbyname_lock);
#endif
#endif /* HAVE_GETHOSTBYNAME_R */ #endif /* HAVE_GETHOSTBYNAME_R */
Py_END_ALLOW_THREADS 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[] = static char ghbn_ex_doc[] =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment