Also ich denke, mit einem Rootkit hat das nichts zu tun.
getaddrinfo() wurde mit IEEE 1003.1-2001 eingeführt und löst die alten Funktionen (
gethostbyname() und
gethostbyaddr()) ab. Vorteil der neuen Funktion: sie ist eintrittsinvariant (und damit thread-safe) und beherrscht sowohl IPv4- als auch IPv6-Adressen.
Versuchen wir mal, den Fehler einzukreisen. Sind die Variablen
hints und
res korrekt deklariert? Das müsste so aussehen:
Code: Select all
struct addrinfo hints;
struct addrinfo *res;
Man beachte den Unterschied, der zweite Parameter von
getaddrinfo() muss ein Zeiger auf einen Zeiger sein (
struct addrinfo **res).
Wenn die Deklarationen korrekt sind, sollte die Funktion auch richtig arbeiten. Wenn sie nicht korrekt ausgeführt wird, kannst Du Dir mit
gai_strerror(ret) eine Fehlerbeschreibung des Rückgabewerts besorgen.
Interessant wäre jetzt allerdings der Codeabschnitt, der das Ergebnis von
getaddrinfo() auswertet. Ein Zeiger auf die Ergebnisstruktur wird in
res gespeichert. Diese Ergebnisstruktur ist aber der Kopf einer verketteten Liste; d. h. der erste Eintrag muss nicht unbedingt der gesuchte sein, sondern man muss über diese Liste iterieren, bis
res->ai_family (natürlich iteriert man eigentlich nicht mit
res, sondern einer separaten Pointer-Variablen, um den Anfang der Liste nicht zu verlieren) der gewünschten Adressfamilie entspricht. Da in Deiner /etc/hosts IPv6- und IPv4-Adressen gemischt stehen, hat die Liste mit ziemlicher Sicherheit mindestens zwei Einträge (im Gegensatz zur alten Variante, wo immer nur ein eindeutiger Satz gefunden werden konnte). Wurde also die Ergebnisauswertung nicht auf eine Schleife umgestellt, so liegt hier mit ziemlicher Sicherheit der Fehler (und das wäre ein grober Schnitzer und hätte eigentlich schon längst jemandem auffallen müssen).
Ansonsten wäre noch sehr interessant zu erfahren, welchen Rückgabewert die Funktion
localhost() liefert - mit selbigem wird
getaddrinfo() ja gefüttert, und an dieser Stelle erwartet
getaddrinfo() entweder eine IP-Adresse (IPv4 oder IPv6) oder einen Hostnamen (FQDN oder einen in /etc/hosts bekannten Alias).
Ach ja, und zu ganz allerletzt: Unterstützt Dein Kernel eigentlich IPv6? Wenn nein, wirf die IPv6-Einträge aus Deiner /etc/hosts wieder raus, das macht sonst nur Ärger und könnte die Ursache für den Fehler sein.