From 60f996f96b4e8b23856c60ec40f5e0c287ff1849 Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Tue, 23 Apr 2019 23:07:27 +0000 Subject: [PATCH] Clean up the hostname look-up stuff: - getnameinfo() was being called with NI_NUMERICHOST in the mail server and web server (but nowhere else) - use a singly-defined macro (STR_NO_HOSTNAME) for the "<no name>" string rather than copying it about - the webserver apparently assumes that session->host_name will always have *some* unique value (e.g. the IP address when no hostname is available) - so account for that special need <grumble> --- src/sbbs3/ftpsrvr.c | 12 ++++-------- src/sbbs3/login.cpp | 2 +- src/sbbs3/mailsrvr.c | 21 ++++++++++----------- src/sbbs3/main.cpp | 2 +- src/sbbs3/sbbsdefs.h | 1 + src/sbbs3/services.c | 27 ++++++++------------------- src/sbbs3/websrvr.c | 21 +++++++++++++-------- 7 files changed, 38 insertions(+), 48 deletions(-) diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c index a866fbb70c..f497c7f0d5 100644 --- a/src/sbbs3/ftpsrvr.c +++ b/src/sbbs3/ftpsrvr.c @@ -3093,15 +3093,11 @@ static void ctrl_thread(void* arg) lprintf(LOG_INFO,"%04d CTRL connection accepted from: %s port %u" ,sock, host_ip, inet_addrport(&ftp.client_addr)); - if(startup->options&FTP_OPT_NO_HOST_LOOKUP) - strcpy(host_name,"<no name>"); - else { - if(getnameinfo(&ftp.client_addr.addr, sizeof(ftp.client_addr), host_name, sizeof(host_name), NULL, 0, NI_NAMEREQD)!=0) - strcpy(host_name,"<no name>"); - } - - if(!(startup->options&FTP_OPT_NO_HOST_LOOKUP)) + SAFECOPY(host_name, STR_NO_HOSTNAME); + if(!(startup->options&FTP_OPT_NO_HOST_LOOKUP)) { + getnameinfo(&ftp.client_addr.addr, sizeof(ftp.client_addr), host_name, sizeof(host_name), NULL, 0, NI_NAMEREQD); lprintf(LOG_INFO,"%04d Hostname: %s", sock, host_name); + } ulong banned = loginBanned(&scfg, startup->login_attempt_list, sock, host_name, startup->login_attempt, &attempted); if(banned || trashcan(&scfg,host_ip,"ip")) { diff --git a/src/sbbs3/login.cpp b/src/sbbs3/login.cpp index 6f39d90164..43d01dca04 100644 --- a/src/sbbs3/login.cpp +++ b/src/sbbs3/login.cpp @@ -156,7 +156,7 @@ void sbbs_t::badlogin(char* user, char* passwd, const char* protocol, xp_sockadd if(addr == NULL) addr = &client_addr; - SAFECOPY(host_name, "<no name>"); + SAFECOPY(host_name, STR_NO_HOSTNAME); socklen_t addr_len = sizeof(*addr); SAFEPRINTF(reason,"%s LOGIN", protocol); count=loginFailure(startup->login_attempt_list, addr, protocol, user, passwd); diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c index 3105a9a14c..4598f3ae49 100644 --- a/src/sbbs3/mailsrvr.c +++ b/src/sbbs3/mailsrvr.c @@ -994,12 +994,12 @@ static void pop3_thread(void* arg) lprintf(LOG_INFO,"%04d %s connection accepted from: %s port %u" ,socket, client.protocol, host_ip, inet_addrport(&pop3.client_addr)); - if(getnameinfo(&pop3.client_addr.addr, pop3.client_addr_len, host_name, sizeof(host_name), NULL, 0, (startup->options&MAIL_OPT_NO_HOST_LOOKUP)?NI_NUMERICHOST:0)!=0) - SAFECOPY(host_name, "<no name>"); - - if(!(startup->options&MAIL_OPT_NO_HOST_LOOKUP) && (startup->options&MAIL_OPT_DEBUG_POP3)) - lprintf(LOG_INFO,"%04d %s Hostname: %s", socket, client.protocol, host_name); - + SAFECOPY(host_name, STR_NO_HOSTNAME); + if(!(startup->options&MAIL_OPT_NO_HOST_LOOKUP)) { + getnameinfo(&pop3.client_addr.addr, pop3.client_addr_len, host_name, sizeof(host_name), NULL, 0, NI_NAMEREQD); + if(startup->options&MAIL_OPT_DEBUG_POP3) + lprintf(LOG_INFO,"%04d %s Hostname: %s", socket, client.protocol, host_name); + } if (pop3.tls_port) { if (get_ssl_cert(&scfg, &estr, &level) == -1) { if (estr) { @@ -2901,12 +2901,11 @@ static void smtp_thread(void* arg) lprintf(LOG_INFO,"%04d %s Connection accepted on port %u from: %s port %u" ,socket, client.protocol, inet_addrport(&server_addr), host_ip, inet_addrport(&smtp.client_addr)); - if(getnameinfo(&smtp.client_addr.addr, smtp.client_addr_len, host_name, sizeof(host_name), NULL, 0, (startup->options&MAIL_OPT_NO_HOST_LOOKUP)?NI_NUMERICHOST:0)!=0) - SAFECOPY(host_name, "<no name>"); - - if(!(startup->options&MAIL_OPT_NO_HOST_LOOKUP)) + SAFECOPY(host_name, STR_NO_HOSTNAME); + if(!(startup->options&MAIL_OPT_NO_HOST_LOOKUP)) { + getnameinfo(&smtp.client_addr.addr, smtp.client_addr_len, host_name, sizeof(host_name), NULL, 0, NI_NAMEREQD); lprintf(LOG_INFO,"%04d %s Hostname: %s", socket, client.protocol, host_name); - + } protected_uint32_adjust(&active_clients, 1); update_clients(); diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp index 3f9e092760..6bd10ac1ab 100644 --- a/src/sbbs3/main.cpp +++ b/src/sbbs3/main.cpp @@ -5676,7 +5676,7 @@ NO_SSH: sbbs->bprintf("\r\n%s\r\n", VERSION_NOTICE); sbbs->bprintf("%s connection from: %s\r\n", client.protocol, host_ip); - SAFECOPY(host_name, "<no name>"); + SAFECOPY(host_name, STR_NO_HOSTNAME); if(!(startup->options&BBS_OPT_NO_HOST_LOOKUP)) { sbbs->bprintf("Resolving hostname..."); getnameinfo(&client_addr.addr, client_addr_len, host_name, sizeof(host_name), NULL, 0, NI_NAMEREQD); diff --git a/src/sbbs3/sbbsdefs.h b/src/sbbs3/sbbsdefs.h index 23c67d6b3e..397125ccc1 100644 --- a/src/sbbs3/sbbsdefs.h +++ b/src/sbbs3/sbbsdefs.h @@ -70,6 +70,7 @@ #define UNKNOWN_LOAD_ERROR "Unknown load error - Library mismatch?" #define STR_UNKNOWN_USER "<unknown user>" +#define STR_NO_HOSTNAME "<no name>" #define JAVASCRIPT_MAX_BYTES (8*1024*1024) #define JAVASCRIPT_CONTEXT_STACK (16*1024) diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c index 8fd457ab7a..875b67ab22 100644 --- a/src/sbbs3/services.c +++ b/src/sbbs3/services.c @@ -1002,19 +1002,13 @@ static void js_service_thread(void* arg) protected_uint32_adjust(&threads_pending_start, -1); /* Host name lookup and filtering */ - if(service->options&BBS_OPT_NO_HOST_LOOKUP - || startup->options&BBS_OPT_NO_HOST_LOOKUP) - SAFECOPY(host_name, "<no name>"); - else { - if(getnameinfo(&service_client.addr.addr, xp_sockaddr_len(&service_client), host_name, sizeof(host_name), NULL, 0, NI_NAMEREQD) != 0) - SAFECOPY(host_name, "<no name>"); - } - + SAFECOPY(host_name, STR_NO_HOSTNAME); if(!(service->options&BBS_OPT_NO_HOST_LOOKUP) - && !(startup->options&BBS_OPT_NO_HOST_LOOKUP) - && service->log_level >= LOG_INFO) { - lprintf(LOG_INFO,"%04d %s Hostname: %s" - ,socket, service->protocol, host_name); + && !(startup->options&BBS_OPT_NO_HOST_LOOKUP)) { + getnameinfo(&service_client.addr.addr, xp_sockaddr_len(&service_client), host_name, sizeof(host_name), NULL, 0, NI_NAMEREQD); + if(service->log_level >= LOG_INFO) + lprintf(LOG_INFO,"%04d %s Hostname: %s" + ,socket, service->protocol, host_name); } if(trashcan(&scfg,host_name,"host")) { @@ -1390,15 +1384,10 @@ static void native_service_thread(void* arg) protected_uint32_adjust(&threads_pending_start, -1); /* Host name lookup and filtering */ - if(service->options&BBS_OPT_NO_HOST_LOOKUP - || startup->options&BBS_OPT_NO_HOST_LOOKUP) - SAFECOPY(host_name, "<no name>"); - else - if(getnameinfo(&service_client.addr.addr, xp_sockaddr_len(&service_client), host_name, sizeof(host_name), NULL, 0, NI_NAMEREQD)!=0) - SAFECOPY(host_name, "<no name>"); - + SAFECOPY(host_name, STR_NO_HOSTNAME); if(!(service->options&BBS_OPT_NO_HOST_LOOKUP) && !(startup->options&BBS_OPT_NO_HOST_LOOKUP)) { + getnameinfo(&service_client.addr.addr, xp_sockaddr_len(&service_client), host_name, sizeof(host_name), NULL, 0, NI_NAMEREQD); lprintf(LOG_INFO,"%04d %s Hostname: %s" ,socket, service->protocol, host_name); #if 0 /* gethostbyaddr() is apparently not (always) thread-safe diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c index 45bdb18184..5e1cfcd032 100644 --- a/src/sbbs3/websrvr.c +++ b/src/sbbs3/websrvr.c @@ -6283,19 +6283,18 @@ void http_session_thread(void* arg) sbbs_srand(); /* Seed random number generator */ - if(getnameinfo(&session.addr.addr, session.addr_len, session.host_name, sizeof(session.host_name), NULL, 0, (startup->options&BBS_OPT_NO_HOST_LOOKUP)?NI_NUMERICHOST:0)!=0) - SAFECOPY(session.host_name, session.host_ip); - + char host_name[128] = ""; if(!(startup->options&BBS_OPT_NO_HOST_LOOKUP)) { - lprintf(LOG_INFO,"%04d Hostname: %s", session.socket, session.host_name); + getnameinfo(&session.addr.addr, session.addr_len, host_name, sizeof(host_name), NULL, 0, NI_NAMEREQD); + lprintf(LOG_INFO,"%04d Hostname: %s", session.socket, host_name[0] ? host_name : STR_NO_HOSTNAME); #if 0 /* gethostbyaddr() is apparently not (always) thread-safe and getnameinfo() doesn't return alias information */ for(i=0;host!=NULL && host->h_aliases!=NULL && host->h_aliases[i]!=NULL;i++) lprintf(LOG_INFO,"%04d HostAlias: %s", session.socket, host->h_aliases[i]); #endif - if(trashcan(&scfg,session.host_name,"host")) { - lprintf(LOG_NOTICE,"%04d !CLIENT BLOCKED in host.can: %s", session.socket, session.host_name); + if(host_name[0] && trashcan(&scfg, host_name,"host")) { + lprintf(LOG_NOTICE,"%04d !CLIENT BLOCKED in host.can: %s", session.socket, host_name); close_session_socket(&session); sem_wait(&session.output_thread_terminated); sem_destroy(&session.output_thread_terminated); @@ -6304,9 +6303,15 @@ void http_session_thread(void* arg) return; } } + if(host_name[0]) + SAFECOPY(session.host_name, host_name); + else { + SAFECOPY(session.host_name, session.host_ip); + SAFECOPY(host_name, STR_NO_HOSTNAME); + } login_attempt_t attempted; - ulong banned = loginBanned(&scfg, startup->login_attempt_list, session.socket, session.host_name, startup->login_attempt, &attempted); + ulong banned = loginBanned(&scfg, startup->login_attempt_list, session.socket, host_name, startup->login_attempt, &attempted); /* host_ip wasn't defined in http_session_thread */ if(banned || trashcan(&scfg,session.host_ip,"ip")) { @@ -6329,7 +6334,7 @@ void http_session_thread(void* arg) SAFECOPY(session.username,unknown); SAFECOPY(session.client.addr,session.host_ip); - SAFECOPY(session.client.host,session.host_name); + SAFECOPY(session.client.host, host_name); session.client.port=inet_addrport(&session.addr); session.client.time=time32(NULL); session.client.protocol=session.is_tls ? "HTTPS":"HTTP"; -- GitLab