From 45fc293fa4f3071711a67c85b1337e5b1eebea23 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Mon, 19 Aug 2019 19:12:50 +0000 Subject: [PATCH] ctdl_tcp_server and ctdl_uds_server improved handling of error conditions in places like getprotobyname() which normally never throw an error, but in container universe it's a new game. --- citadel/serv_extensions.c | 11 +++-------- citadel/sysdep.c | 41 ++++++++++++++++----------------------- citadel/sysdep_decls.h | 4 ++-- 3 files changed, 22 insertions(+), 34 deletions(-) diff --git a/citadel/serv_extensions.c b/citadel/serv_extensions.c index f967e411b..73a1b7911 100644 --- a/citadel/serv_extensions.c +++ b/citadel/serv_extensions.c @@ -853,9 +853,7 @@ void CtdlRegisterServiceHook(int tcp_port, { ServiceFunctionHook *newfcn; char *message; - char error[SIZ]; - strcpy(error, ""); newfcn = (ServiceFunctionHook *) malloc(sizeof(ServiceFunctionHook)); message = (char*) malloc (SIZ + SIZ); @@ -868,7 +866,7 @@ void CtdlRegisterServiceHook(int tcp_port, newfcn->ServiceName = ServiceName; if (sockpath != NULL) { - newfcn->msock = ctdl_uds_server(sockpath, CtdlGetConfigInt("c_maxsessions"), error); + newfcn->msock = ctdl_uds_server(sockpath, CtdlGetConfigInt("c_maxsessions")); snprintf(message, SIZ, "extensions: unix domain socket '%s': ", sockpath); } else if (tcp_port <= 0) { /* port -1 to disable */ @@ -878,10 +876,7 @@ void CtdlRegisterServiceHook(int tcp_port, return; } else { - newfcn->msock = ctdl_tcp_server(CtdlGetConfigStr("c_ip_addr"), - tcp_port, - CtdlGetConfigInt("c_maxsessions"), - error); + newfcn->msock = ctdl_tcp_server(CtdlGetConfigStr("c_ip_addr"), tcp_port, CtdlGetConfigInt("c_maxsessions")); snprintf(message, SIZ, "extensions: TCP port %s:%d: (%s) ", CtdlGetConfigStr("c_ip_addr"), tcp_port, ServiceName); } @@ -892,7 +887,7 @@ void CtdlRegisterServiceHook(int tcp_port, syslog(LOG_INFO, "%s", message); } else { - AddPortError(message, error); + AddPortError(message, "failed"); strcat(message, "FAILED."); syslog(LOG_ERR, "%s", message); free(newfcn); diff --git a/citadel/sysdep.c b/citadel/sysdep.c index c547f9772..9b1bcfa56 100644 --- a/citadel/sysdep.c +++ b/citadel/sysdep.c @@ -128,7 +128,7 @@ void init_sysdep(void) { * port_number port number to bind * queue_len number of incoming connections to allow in the queue */ -int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len, char *errormessage) +int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len) { struct protoent *p; struct sockaddr_in6 sin6; @@ -157,8 +157,7 @@ int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len, char *errorme { ip_version = 4; if (inet_pton(AF_INET, ip_addr, &sin4.sin_addr) <= 0) { - snprintf(errormessage, SIZ, "Error binding to [%s] : %s", ip_addr, strerror(errno)); - syslog(LOG_ALERT, "tcpserver: %s", errormessage); + syslog(LOG_ALERT, "tcpserver: inet_pton: %m"); return (-1); } } @@ -166,26 +165,27 @@ int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len, char *errorme { ip_version = 6; if (inet_pton(AF_INET6, ip_addr, &sin6.sin6_addr) <= 0) { - snprintf(errormessage, SIZ, "Error binding to [%s] : %s", ip_addr, strerror(errno)); - syslog(LOG_ALERT, "tcpserver: %s", errormessage); + syslog(LOG_ALERT, "tcpserver: inet_pton: %m"); return (-1); } } if (port_number == 0) { - snprintf(errormessage, SIZ, "Can't start: no port number specified."); - syslog(LOG_ALERT, "tcpserver: %s", errormessage); + syslog(LOG_ALERT, "tcpserver: no port number was specified"); return (-1); } sin6.sin6_port = htons((u_short) port_number); sin4.sin_port = htons((u_short) port_number); p = getprotobyname("tcp"); + if (p == NULL) { + syslog(LOG_ALERT, "tcpserver: getprotobyname: %m"); + return (-1); + } s = socket( ((ip_version == 6) ? PF_INET6 : PF_INET), SOCK_STREAM, (p->p_proto)); if (s < 0) { - snprintf(errormessage, SIZ, "Can't create a listening socket: %s", strerror(errno)); - syslog(LOG_ALERT, "tcpserver: %s", errormessage); + syslog(LOG_ALERT, "tcpserver: socket: %m"); return (-1); } /* Set some socket options that make sense. */ @@ -200,16 +200,14 @@ int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len, char *errorme } if (b < 0) { - snprintf(errormessage, SIZ, "Can't bind: %s", strerror(errno)); - syslog(LOG_ALERT, "tcpserver: %s", errormessage); + syslog(LOG_ALERT, "tcpserver: bind: %m"); return (-1); } fcntl(s, F_SETFL, O_NONBLOCK); if (listen(s, ((queue_len >= 5) ? queue_len : 5) ) < 0) { - snprintf(errormessage, SIZ, "Can't listen: %s", strerror(errno)); - syslog(LOG_ALERT, "tcpserver: %s", errormessage); + syslog(LOG_ALERT, "tcpserver: listen: %m"); return (-1); } return (s); @@ -219,7 +217,7 @@ int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len, char *errorme /* * Create a Unix domain socket and listen on it */ -int ctdl_uds_server(char *sockpath, int queue_len, char *errormessage) +int ctdl_uds_server(char *sockpath, int queue_len) { struct sockaddr_un addr; int s; @@ -234,8 +232,7 @@ int ctdl_uds_server(char *sockpath, int queue_len, char *errormessage) i = unlink(sockpath); if ((i != 0) && (errno != ENOENT)) { - snprintf(errormessage, SIZ, "can't unlink %s: %s", sockpath, strerror(errno)); - syslog(LOG_ERR, "udsserver: %s", errormessage); + syslog(LOG_ERR, "udsserver: %m"); return(-1); } @@ -245,28 +242,24 @@ int ctdl_uds_server(char *sockpath, int queue_len, char *errormessage) s = socket(AF_UNIX, SOCK_STREAM, 0); if (s < 0) { - snprintf(errormessage, SIZ, "can't create a socket: %s", strerror(errno)); - syslog(LOG_ERR, "udsserver: %s", errormessage); + syslog(LOG_ERR, "udsserver: socket: %m"); return(-1); } if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - snprintf(errormessage, SIZ, "can't bind: %s", strerror(errno)); - syslog(LOG_ERR, "udsserver: %s", errormessage); + syslog(LOG_ERR, "udsserver: bind: %m"); return(-1); } /* set to nonblock - we need this for some obscure situations */ if (fcntl(s, F_SETFL, O_NONBLOCK) < 0) { - snprintf(errormessage, SIZ, "can't set socket to non-blocking: %s", strerror(errno)); - syslog(LOG_ERR, "udsserver: %s", errormessage); + syslog(LOG_ERR, "udsserver: fcntl: %m"); close(s); return(-1); } if (listen(s, actual_queue_len) < 0) { - snprintf(errormessage, SIZ, "can't listen: %s", strerror(errno)); - syslog(LOG_ERR, "udsserver: %s", errormessage); + syslog(LOG_ERR, "udsserver: listen: %m"); return(-1); } diff --git a/citadel/sysdep_decls.h b/citadel/sysdep_decls.h index 89348bf37..221640fdd 100644 --- a/citadel/sysdep_decls.h +++ b/citadel/sysdep_decls.h @@ -39,8 +39,8 @@ void cprintf (const char *format, ...); #endif void init_sysdep (void); -int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len, char *errormessage); -int ctdl_uds_server(char *sockpath, int queue_len, char *errormessage); +int ctdl_tcp_server(char *ip_addr, int port_number, int queue_len); +int ctdl_uds_server(char *sockpath, int queue_len); void buffer_output(void); void unbuffer_output(void); void flush_output(void); -- 2.30.2