getfqdn passes a hostname to gethostbyaddr instead of an ip address

Florian Bergmann fbergmann at suse.de
Wed Sep 12 10:29:34 EDT 2018


Hello,

While I was debugging some salt issues I dug into the python code and found a
piece of code in the `socket.py` module that surprised my a bit:

In the `getfqdn` function the `gethostbyaddr` name function is being called with
a `hostname` instead of an `ipaddress`:

```python
def getfqdn(name=''):
    """Get fully qualified domain name from name.
    An empty argument is interpreted as meaning the local host.
    First the hostname returned by gethostbyaddr() is checked, then
    possibly existing aliases. In case no FQDN is available, hostname
    from gethostname() is returned.
    """
    name = name.strip()
    if not name or name == '0.0.0.0':
        name = gethostname() # (1)
    try:
        hostname, aliases, ipaddrs = gethostbyaddr(name) # (2)
    except error:
        pass
    else:
        aliases.insert(0, hostname)
        for name in aliases:
            if '.' in name:
                break
        else:
            name = hostname
    return name
```

1. `gethostname()`:

The documentation states:

```
Return a string containing the hostname of the machine where the Python interpreter is currently executing.

If you want to know the current machine’s IP address, you may want to use gethostbyname(gethostname()).
```

2. `gethostbyaddr()`:

Also from the documentation:

```
Return a triple (hostname, aliaslist, ipaddrlist) where hostname is the primary host name responding to the *given ip_address* (...)
```

As the documentation states it expects an `ip_address` and not a hostname,
but it is given a `hostname` instead.

I used the following two snippets to check the different behaviors:

```
python -c 'import socket; print(socket.gethostbyaddr(socket.gethostbyname(socket.gethostname())))'
```

```
python -c 'import socket; print(socket.gethostbyaddr(socket.gethostname()))'
```

Now on *most* of my machines the results are exactly the same, but on some it
differs (which I actually attribute to strange `/etc/hosts` configurations).

On the other hand I feel given the documentation, passing the `ip_address` would
be the right thing to do, so I am wondering if I am missing something very
obvious here (especially given that the code seems to be unchanged for 18 years).

Best regards,

Florian



More information about the Python-list mailing list