Un cas intéressant cité par Phil Mayers sur la liste des
utilisateurs de
La question originale était de savoir pourquoi on pouvait faire
une résolution
% dig +short nexistesurementpas.um.outlook.com
*.um.outlook.com.glbdns2.microsoft.com.
wildcard-emeasouth.um.outlook.com.
157.55.9.252
On récupère bien une
% ping nexistesurementpas.um.outlook.com
ping: unknown host nexistesurementpas.um.outlook.com
Mais, alors, pourquoi est-ce que ping prétend que ce nom n'existe
pas ? (Le problème n'est pas spécifique à ping, d'autres
commandes comme
L'explication est qu'il existe une différence entre les
% dig +short +nodnssec '&-funny-%-syntax-$.bortzmeyer.org'
www.bortzmeyer.org.
204.62.14.153
Mais que je ne peux pas l'utiliser :
% ping '&-funny-%-syntax-$.bortzmeyer.org'
ping: unknown host &-funny-%-syntax-$.bortzmeyer.org
(Notez qu'il a fallu l'encadrer
d'
Arrivé à ce stade, mes lecteurs et lectrices, qui sont très
malins, se grattent la tête « OK dans l'exemple avec
% dig nexistesurementpas.um.outlook.com
...
;; ANSWER SECTION:
nexistesurementpas.um.outlook.com. 0 IN CNAME *.um.outlook.com.glbdns2.microsoft.com.
*.um.outlook.com.glbdns2.microsoft.com. 0 IN CNAME wildcard-emeasouth.um.outlook.com.
wildcard-emeasouth.um.outlook.com. 300 IN A 157.55.9.252
Le nom est en fait un pointeur (enregistrement DNS de type
Or, le sous-programme
À noter que le résultat dépend du
$ ping -c 1 '&-funny-%-syntax-$.bortzmeyer.org'
PING www.bortzmeyer.org (204.62.14.153): 56 data bytes
64 bytes from 204.62.14.153: icmp_seq=0 ttl=51 time=73.471 ms
--- www.bortzmeyer.org ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 73.471/73.471/73.471/0.000 ms
Windows, lui, accepte le premier nom (la machine ne répond pas aux
requêtes
E:\Users\moi>ping -n 1 nexistesurementpas.um.outlook.com
Envoi d'une requête 'ping' sur wildcard-emeacenter.um.outlook.com [157.55.9.252] avec 32 octets de données :
Délai d'attente de la demande dépassé.
Statistiques Ping pour 157.55.9.252:
Paquets : envoyés = 1, reçus = 0, perdus = 1 (perte 100%),
Les programmeurs n'ont qu'à jeter un œil au code source de la
GNU libc, dans
= 0x41 && (c) <= 0x5a) \
|| ((c) >= 0x61 && (c) <= 0x7a))
#define digitchar(c) ((c) >= 0x30 && (c) <= 0x39)
#define borderchar(c) (alphachar(c) || digitchar(c))
#define middlechar(c) (borderchar(c) || hyphenchar(c) || underscorechar(c))
#define domainchar(c) ((c) > 0x20 && (c) < 0x7f)
int
res_hnok(const char *dn) {
int pch = PERIOD, ch = *dn++;
while (ch != '\0') {
int nch = *dn++;
if (periodchar(ch)) {
(void)NULL;
} else if (periodchar(pch)) {
if (!borderchar(ch))
return (0);
} else if (periodchar(nch) || nch == '\0') {
if (!borderchar(ch))
return (0);
} else {
if (!middlechar(ch))
return (0);
}
pch = ch, ch = nch;
}
return (1);
}
]]>
Ce code teste que le nom de machine suit l'
À noter qu'on a testé que le cas où le nom illégal est au milieu de la chaîne des pointeurs. Il serait intéressant de refaire le test avec tous ces systèmes d'exploitation pour les cas où le nom illégal est au début ou à la fin de cette chaîne.
Un post-scriptum pour mes lecteurs juristes : les définitions
de domaine et de machine utilisées ici sont évidemment celles des
Merci à Kim-Minh Kaplan pour la discussion et à Vincent Archer et Pascal Courtois pour avoir prêté des machines à la science.