Skip to content

Gevent's monkeypatch replacement of socket.getaddrinfo has an incorrectly named parameter, leading to TypeErrors #960

@js6626069

Description

@js6626069
  • gevent version: 1.2.1
  • Python version: 3.5.2
  • Operating System: Ubuntu 16.04

Description:

In Python 3.2, the socket.getaddrinfo parameter socktype was renamed to type. This change is not reflected in gevent's monkeypatch replacement of this function (gevent._socketcommon.getaddrinfo). As a result, code that calls socket.getaddrinfo, specifying the type parameter as a keyword argument, raises a TypeError, if gevent.monkey.patch_socket was called previously.

I noticed this issue because it affects the smtpd.SMTPServer from the Python standard library. socket.getaddrinfo is called in its __init__ method (source), so trying to create an SMTPServer object under gevent fails with a TypeError.

What I've run:

Error when calling socket.getaddrinfo directly:

$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> socket.getaddrinfo("127.0.0.1", 80, type=socket.SOCK_STREAM)
[(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('127.0.0.1', 80))]
>>> from gevent.monkey import patch_socket
>>> patch_socket()
>>> socket.getaddrinfo("127.0.0.1", 80, type=socket.SOCK_STREAM)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: getaddrinfo() got an unexpected keyword argument 'type'

Error when instantiating smtpd.SMTPServer:

$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from gevent.monkey import patch_socket
>>> patch_socket()
>>> from smtpd import SMTPServer
>>> SMTPServer(("127.0.0.1", 25), None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/smtpd.py", line 658, in __init__
    type=socket.SOCK_STREAM)
TypeError: getaddrinfo() got an unexpected keyword argument 'type'

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions