From e30931d95894869fa0d7e0e544f2373bfec73e4d Mon Sep 17 00:00:00 2001 From: Marco d'Itri Date: Mon, 5 May 2025 23:41:19 +0200 Subject: [PATCH] Use the last ReferralServer field found Because we want to follow the referral for the most specific record returned. Closes GitHub #185. --- whois.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/whois.c b/whois.c index c86e694..72aecec 100644 --- a/whois.c +++ b/whois.c @@ -892,9 +892,6 @@ static void find_referral_server_arin(char **referral_server, const char *buf) { char *p; - if (*referral_server) - return; - /* ARIN referrals: * ReferralServer: rwhois://rwhois.fuse.net:4321/ * ReferralServer: whois://whois.ripe.net @@ -903,6 +900,16 @@ static void find_referral_server_arin(char **referral_server, const char *buf) if (!strneq(buf, "ReferralServer:", 15)) return; + /* When whois.arin.net returns multiple NetRange records, they will + * appear from the less specific one to the most specific one. + * Since the range we care about is the most specific one then we + * need to use the last ReferralServer field found. + */ + if (*referral_server) { + free(*referral_server); + *referral_server = NULL; + } + if ((p = strstr(buf, "rwhois://"))) *referral_server = strdup(p + 9); else if ((p = strstr(buf, "whois://")))