From 955becc3d963ebd66a1edea22d47dd24f34035e7 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 22 Mar 1999 20:14:53 +0000 Subject: [PATCH] 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. --- Modules/socketmodule.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 8b087d2ce12..da1d223997b 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -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[] =