Por que o MacOSX tenta resolver endereços IP preenchidos com zero como nomes de host?

4

Este causou dor de cabeça a um amigo ao configurar uma conexão de internet comutada que tinha zero endereços IP preenchidos no documento de configuração da seguinte forma:

192.168.019.254

Não importa como ele tentou configurar a pilha de rede do Mac, simplesmente não funcionou. Mas a GUI também não se queixou de erros.

Mais tarde eu descobri que ping nesses endereços preenchidos com zero em um terminal mostrava "incapaz de resolver" enquanto o ping no mesmo endereço sem zeros preenchidos ( 192.168.19.254 vs. 192.168.019.254 ) mostrava "incapaz de alcançar" o que trouxe muita luz para este mysterium. Remover os zeros inúteis fez tudo funcionar.

Isso é um bug ou um recurso? Eu nunca experimentei um comportamento tão estranho antes - não importa se eu uso a GUI ou a CLI para configurar ou testar coisas de IP.

    
por hurikhan77 15.02.2010 / 01:17

1 resposta

10

A conversão de uma string para um endereço geralmente é realizada pela função POSIX getaddrinfo() . Esta função primeiro verifica um endereço IP numérico usando inet_addr() , e se isso falhar, Em seguida, tente resolver a cadeia como um nome de domínio. inet_addr() interpreta números com 0 inicial como octal, portanto, por exemplo, 010 se tornaria 8 e 019 seriam um erro (e, portanto, seriam resolvidos como um nome de domínio). O mesmo comportamento ocorre no Linux e no Solaris também.

Em getaddrinfo() :

If the specified address family is AF_INET or AF_UNSPEC, address strings using Internet standard dot notation as specified in inet_addr() are valid.

Em inet_addr() :

All numbers supplied as parts in IPv4 dotted decimal notation may be decimal, octal, or hexadecimal, as specified in the ISO C standard (that is, a leading 0x or 0X implies hexadecimal; otherwise, a leading '0' implies octal; otherwise, the number is interpreted as decimal).

Anote o endereço 192.168.8.254 entre parênteses:

$ ping 192.168.010.254
PING 192.168.010.254 (192.168.8.254): 56 data bytes
Request timeout for icmp_seq 0
    
por 15.02.2010 / 03:11