New submission from Doug Freed:

On at least Linux (and probably most other UNIXes, except OS X), the C 
functions getservbyname(), getservbyport(), and getprotobyname() are not 
threadsafe.  CPython's wrappers around these functions in the socket module do 
nothing to cover up this fact.  Simple reproduction script for getservbyname 
(others similar):

```
import threading
import socket

def getservbyname_loop(service, port):
        while True:
                result = socket.getservbyname(service)
                if result != port:
                        raise RuntimeError("thread-safety broken, got %d, 
expected %d" % (result, port))

thread1 = threading.Thread(target=getservbyname_loop, args=("ssh", 22))
thread2 = threading.Thread(target=getservbyname_loop, args=("smtp", 25))
thread1.start()
thread2.start()
```

One of the threads will throw the RuntimeError, saying it got the port number 
the other thread should have gotten.

Naive fix: a lock (eg, just use the netdb_lock already created in the module)

Proper fix: use the libc's reentrant variant if available, and fall back to 
locking if not (see gethostbyname_ex() implementation for example).

I'd be happy to work on this, but as I don't have access to anything other than 
Linux and OS X at the moment, it would be helpful if platform maintainers could 
chime in on what if any reentrant variants of these functions exist on their 
platforms so we can have a more proper fix.

----------
components: Extension Modules
messages: 294540
nosy: dwfreed
priority: normal
severity: normal
status: open
title: socket.getservbyname(), socket.getservbyport(), socket.getprotobyname() 
are not threadsafe
type: behavior
versions: Python 2.7, Python 3.3, Python 3.4, Python 3.5, Python 3.6, Python 3.7

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue30482>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to