Please try this one instead. Index: head/src/netutil.c =================================================================== --- head.orig/src/netutil.c 2003-11-28 10:55:12.000000000 +1100 +++ head/src/netutil.c 2004-02-19 14:10:49.000000000 +1100 @@ -2,7 +2,7 @@ * * distcc -- A simple distributed compiler system * - * Copyright (C) 2002, 2003 by Martin Pool <[EMAIL PROTECTED]> + * Copyright (C) 2002, 2003, 2004 by Martin Pool <[EMAIL PROTECTED]> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -140,18 +140,29 @@ char host[1024]; char port[32]; - err = getnameinfo(sa, salen, - host, sizeof host, - port, sizeof port, - NI_NUMERICHOST | NI_NUMERICSERV); - if (err) { - rs_log_error("getnameinfo failed: %s", gai_strerror(err)); - *p_buf = strdup("(UNKNOWN)"); - return EXIT_DISTCC_FAILED; /* more specific? */ + if (!sa) { + *p_buf = strdup("NOTSOCKET"); + return 0; + } else if (sa->sa_family == AF_INET || sa->sa_family == AF_INET6) { + err = getnameinfo(sa, salen, + host, sizeof host, + port, sizeof port, + NI_NUMERICHOST | NI_NUMERICSERV); + if (err) { + rs_log_warning("getnameinfo failed: %s", gai_strerror(err)); + *p_buf = strdup("(UNKNOWN)"); + return 0; /* it's still a valid string */ + } + + asprintf(p_buf, "%s:%s", host, port); + } else if (sa->sa_family == AF_UNIX) { + /* NB: The word 'sun' is predefined on Solaris */ + struct sockaddr_un *sa_un = (struct sockaddr_un *) sa; + asprintf(p_buf, "UNIX-DOMAIN %s", sa_un->sun_path); + } else { + asprintf(p_buf, "UNKNOWN-FAMILY %d", sa->sa_family); } - asprintf(p_buf, "%s:%s", host, port); - return 0; } #else /* ndef ENABLE_RFC2553 */ @@ -159,7 +170,10 @@ int UNUSED(salen), char **p_buf) { - if (sa->sa_family == AF_INET) { + if (!sa) { + *p_buf = strdup("NOTSOCKET"); + return 0; + } else if (sa->sa_family == AF_INET) { struct sockaddr_in *sain = (struct sockaddr_in *) sa; asprintf(p_buf, "%s:%d", inet_ntoa(sain->sin_addr), Index: head/src/daemon.c =================================================================== --- head.orig/src/daemon.c 2004-02-19 14:07:06.000000000 +1100 +++ head/src/daemon.c 2004-02-19 14:07:26.000000000 +1100 @@ -278,6 +278,7 @@ /* This can fail with ENOTSOCK if e.g. sshd has started us on a pipe, * not on a socket. I think it's harmless. */ rs_log_notice("failed to get peer name: %s", strerror(errno)); + psa = NULL; /* make sure we don't refer to uninitialized mem */ len = 0; } Index: head/src/srvnet.c =================================================================== --- head.orig/src/srvnet.c 2004-01-12 12:01:21.000000000 +1100 +++ head/src/srvnet.c 2004-02-19 14:09:38.000000000 +1100 @@ -208,6 +208,8 @@ /** * Log client IP address and perform access control checks. + * + * Note that PSA may be NULL if the sockaddr is unknown. **/ int dcc_check_client(struct sockaddr *psa, int salen, @@ -226,7 +228,7 @@ /* if there are any access entries, then we must match one */ if (allowed) { for (l = allowed; l; l = l->next) { - if (psa->sa_family == AF_INET) { + if (psa && psa->sa_family == AF_INET) { /* At the moment, access control is only supported for IPv4 */ in_addr_t cli_inaddr; @@ -245,3 +247,4 @@ return 0; } + Index: head/ChangeLog =================================================================== --- head.orig/ChangeLog 2004-02-19 13:59:56.000000000 +1100 +++ head/ChangeLog 2004-02-19 14:10:50.000000000 +1100 @@ -1,5 +1,18 @@ 2004-02-19 Martin Pool <[EMAIL PROTECTED]> + * src/netutil.c (dcc_sockaddr_to_string): Handle null sockaddr. + + * src/srvnet.c (dcc_check_client): Handle null sockaddr. + + * src/daemon.c (dcc_inetd_server): If there is no sockaddr, pass + it as NULL. + + * src/netutil.c (dcc_sockaddr_to_string): [ENABLE_RFC2553]: + Failure to convert the address to a string should be just a + warning, not an error. Add special cases for unix-domain sockets + and unknown address families. Possibly fixes SSH connections with + ENABLE_RFC2553. + * src/daemon.c (dcc_inetd_server): Downgrade warning on getpeername failure to just a notice message.
-- Martin
signature.asc
Description: Digital signature
__ distcc mailing list http://distcc.samba.org/ To unsubscribe or change options: http://lists.samba.org/mailman/listinfo/distcc