Author: rjung Date: Thu Jan 1 21:34:22 2015 New Revision: 1648948 URL: http://svn.apache.org/r1648948 Log: BZ 56452: Fix crash in debug logging for IPv6 adresses.
Modified: tomcat/jk/trunk/native/common/jk_ajp_common.c tomcat/jk/trunk/native/common/jk_connect.c tomcat/jk/trunk/native/common/jk_connect.h tomcat/jk/trunk/native/common/jk_status.c tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml Modified: tomcat/jk/trunk/native/common/jk_ajp_common.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_ajp_common.c?rev=1648948&r1=1648947&r2=1648948&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_ajp_common.c (original) +++ tomcat/jk/trunk/native/common/jk_ajp_common.c Thu Jan 1 21:34:22 2015 @@ -1050,7 +1050,7 @@ int ajp_connect_to_endpoint(ajp_endpoint ae->last_errno = errno; jk_log(l, JK_LOG_INFO, "(%s) Failed opening socket to (%s) (errno=%d)", - ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf), + ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf, sizeof(buf)), ae->last_errno); JK_TRACE_EXIT(l); return JK_FALSE; @@ -1323,7 +1323,7 @@ int ajp_connection_tcp_get_message(ajp_e jk_log(l, JK_LOG_INFO, "(%s) can't receive the response header message from tomcat, " "tomcat (%s) has forced a connection close for socket %d", - ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf), + ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf, sizeof(buf)), ae->sd); } else { @@ -1331,7 +1331,7 @@ int ajp_connection_tcp_get_message(ajp_e jk_log(l, JK_LOG_INFO, "(%s) can't receive the response header message from tomcat, " "network problems or tomcat (%s) is down (errno=%d)", - ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf), + ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf, sizeof(buf)), ae->last_errno); } ajp_abort_endpoint(ae, JK_FALSE, l); @@ -1347,13 +1347,13 @@ int ajp_connection_tcp_get_message(ajp_e if (header == AJP14_SW_HEADER) { jk_log(l, JK_LOG_ERROR, "(%s) received AJP14 reply on an AJP13 connection from %s", - ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf)); + ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf, sizeof(buf))); } else { jk_log(l, JK_LOG_ERROR, "(%s) wrong message format 0x%04x from %s", ae->worker->name, header, jk_dump_hinfo(&ae->worker->worker_inet_addr, - buf)); + buf, sizeof(buf))); } /* We've got a protocol error. * We can't trust this connection any more. @@ -1369,13 +1369,13 @@ int ajp_connection_tcp_get_message(ajp_e if (header == AJP13_SW_HEADER) { jk_log(l, JK_LOG_ERROR, "(%s) received AJP13 reply on an AJP14 connection from %s", - ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf)); + ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf, sizeof(buf))); } else { jk_log(l, JK_LOG_ERROR, "(%s) wrong message format 0x%04x from %s", ae->worker->name, header, jk_dump_hinfo(&ae->worker->worker_inet_addr, - buf)); + buf, sizeof(buf))); } /* We've got a protocol error. * We can't trust this connection any more. @@ -1393,7 +1393,7 @@ int ajp_connection_tcp_get_message(ajp_e jk_log(l, JK_LOG_ERROR, "(%s) wrong message size %d %d from %s", ae->worker->name, msglen, msg->maxlen, - jk_dump_hinfo(&ae->worker->worker_inet_addr, buf)); + jk_dump_hinfo(&ae->worker->worker_inet_addr, buf, sizeof(buf))); /* We've got a protocol error. * We can't trust this connection any more. */ @@ -1418,7 +1418,7 @@ int ajp_connection_tcp_get_message(ajp_e jk_log(l, JK_LOG_ERROR, "(%s) can't receive the response body message from tomcat, " "tomcat (%s) has forced a connection close for socket %d", - ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf), + ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf, sizeof(buf)), ae->sd); } else { @@ -1426,7 +1426,7 @@ int ajp_connection_tcp_get_message(ajp_e jk_log(l, JK_LOG_ERROR, "(%s) can't receive the response body message from tomcat, " "network problems or tomcat (%s) is down (errno=%d)", - ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf), + ae->worker->name, jk_dump_hinfo(&ae->worker->worker_inet_addr, buf, sizeof(buf)), ae->last_errno); } ajp_abort_endpoint(ae, JK_FALSE, l); Modified: tomcat/jk/trunk/native/common/jk_connect.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_connect.c?rev=1648948&r1=1648947&r2=1648948&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_connect.c (original) +++ tomcat/jk/trunk/native/common/jk_connect.c Thu Jan 1 21:34:22 2015 @@ -59,6 +59,17 @@ static apr_pool_t *jk_apr_pool = NULL; #define USE_SOCK_CLOEXEC #endif +#ifndef INET6_ADDRSTRLEN +/* Maximum size of an IPv6 address in ASCII */ +#define INET6_ADDRSTRLEN 46 +#endif + +/* 2 IPv6 adresses of length (INET6_ADDRSTRLEN-1) + * each suffixed with a ":" and a port (5 digits) + * plus " -> " plus terminating "\0" + */ +#define DUMP_SINFO_BUF_SZ (2 * (INET6_ADDRSTRLEN - 1 + 1 + 5) + 4 + 1) + #ifndef IN6ADDRSZ #define IN6ADDRSZ 16 #endif @@ -573,7 +584,7 @@ jk_sock_t jk_open_socket(jk_sockaddr_t * int timeout, int connect_timeout, int sock_buf, jk_logger_t *l) { - char buf[64]; + char buf[DUMP_SINFO_BUF_SZ]; jk_sock_t sd; int set = 1; int ret = 0; @@ -753,7 +764,7 @@ jk_sock_t jk_open_socket(jk_sockaddr_t * if (JK_IS_DEBUG_LEVEL(l)) jk_log(l, JK_LOG_DEBUG, "trying to connect socket %d to %s", sd, - jk_dump_hinfo(addr, buf)); + jk_dump_hinfo(addr, buf, sizeof(buf))); /* Need more infos for BSD 4.4 and Unix 98 defines, for now only iSeries when Unix98 is required at compil time */ @@ -771,14 +782,14 @@ iSeries when Unix98 is required at compi if (ret) { jk_log(l, JK_LOG_INFO, "connect to %s failed (errno=%d)", - jk_dump_hinfo(addr, buf), errno); + jk_dump_hinfo(addr, buf, sizeof(buf)), errno); jk_close_socket(sd, l); sd = JK_INVALID_SOCKET; } else { if (JK_IS_DEBUG_LEVEL(l)) jk_log(l, JK_LOG_DEBUG, "socket %d [%s] connected", - sd, jk_dump_sinfo(sd, buf)); + sd, jk_dump_sinfo(sd, buf, sizeof(buf))); } JK_TRACE_EXIT(l); return sd; @@ -855,7 +866,7 @@ int jk_close_socket(jk_sock_t sd, jk_log int jk_shutdown_socket(jk_sock_t sd, jk_logger_t *l) { char dummy[512]; - char buf[64]; + char buf[DUMP_SINFO_BUF_SZ]; char *sb = NULL; int rc = 0; size_t rd = 0; @@ -873,7 +884,7 @@ int jk_shutdown_socket(jk_sock_t sd, jk_ save_errno = errno; if (JK_IS_DEBUG_LEVEL(l)) { - sb = jk_dump_sinfo(sd, buf); + sb = jk_dump_sinfo(sd, buf, sizeof(buf)); jk_log(l, JK_LOG_DEBUG, "About to shutdown socket %d [%s]", sd, sb); } @@ -1124,7 +1135,7 @@ static const char *inet_ntop6(const unsi * Keep this in mind if you think this function should have been coded * to use pointer overlays. All the world's not a VAX. */ - char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; + char tmp[INET6_ADDRSTRLEN], *tp; struct { int base, len; } best = {-1, 0}, cur = {-1, 0}; unsigned int words[IN6ADDRSZ / INT16SZ]; int i; @@ -1224,25 +1235,25 @@ static const char *inet_ntop6(const unsi * dump a jk_sockaddr_t in A.B.C.D:P in ASCII buffer * */ -char *jk_dump_hinfo(jk_sockaddr_t *saddr, char *buf) +char *jk_dump_hinfo(jk_sockaddr_t *saddr, char *buf, size_t size) { char pb[8]; if (saddr->family == JK_INET) { - inet_ntop4(saddr->ipaddr_ptr, buf, 16); + inet_ntop4(saddr->ipaddr_ptr, buf, size); } #if JK_HAVE_IPV6 else { - inet_ntop6(saddr->ipaddr_ptr, buf, 64); + inet_ntop6(saddr->ipaddr_ptr, buf, size); } #endif sprintf(pb, ":%d", saddr->port); - strcat(buf, pb); + strncat(buf, pb, size - strlen(buf) - 1); return buf; } -char *jk_dump_sinfo(jk_sock_t sd, char *buf) +char *jk_dump_sinfo(jk_sock_t sd, char *buf, size_t size) { struct sockaddr rsaddr; struct sockaddr lsaddr; @@ -1256,36 +1267,38 @@ char *jk_dump_sinfo(jk_sock_t sd, char * size_t ps; if (lsaddr.sa_family == JK_INET) { struct sockaddr_in *sa = (struct sockaddr_in *)&lsaddr; - inet_ntop4((unsigned char *)&sa->sin_addr, buf, 16); + inet_ntop4((unsigned char *)&sa->sin_addr, buf, size); sprintf(pb, ":%d", (unsigned int)htons(sa->sin_port)); } #if JK_HAVE_IPV6 else { struct sockaddr_in6 *sa = (struct sockaddr_in6 *)&lsaddr; - inet_ntop6((unsigned char *)&sa->sin6_addr, buf, 64); + inet_ntop6((unsigned char *)&sa->sin6_addr, buf, size); sprintf(pb, ":%d", (unsigned int)htons(sa->sin6_port)); } #endif - strcat(buf, pb); - strcat(buf, " -> "); + ps = strlen(buf); + strncat(buf, pb, size - ps - 1); + ps = strlen(buf); + strncat(buf, " -> ", size - ps - 1); ps = strlen(buf); if (rsaddr.sa_family == JK_INET) { struct sockaddr_in *sa = (struct sockaddr_in *)&rsaddr; - inet_ntop4((unsigned char *)&sa->sin_addr, buf + ps, 16); + inet_ntop4((unsigned char *)&sa->sin_addr, buf + ps, size - ps); sprintf(pb, ":%d", (unsigned int)htons(sa->sin_port)); } #if JK_HAVE_IPV6 else { struct sockaddr_in6 *sa = (struct sockaddr_in6 *)&rsaddr; - inet_ntop6((unsigned char *)&sa->sin6_addr, buf + ps, 64); + inet_ntop6((unsigned char *)&sa->sin6_addr, buf + ps, size - ps); sprintf(pb, ":%d", (unsigned int)htons(sa->sin6_port)); } #endif - strcat(buf, pb); + strncat(buf, pb, size - strlen(buf) - 1); return buf; } } - sprintf(buf, "errno=%d", errno); + snprintf(buf, size, "errno=%d", errno); return buf; } @@ -1306,7 +1319,7 @@ int jk_is_input_event(jk_sock_t sd, int struct pollfd fds; int rc; int save_errno; - char buf[64]; + char buf[DUMP_SINFO_BUF_SZ]; JK_TRACE_ENTER(l); @@ -1323,7 +1336,7 @@ int jk_is_input_event(jk_sock_t sd, int if (JK_IS_DEBUG_LEVEL(l)) { jk_log(l, JK_LOG_DEBUG, "timeout during poll on socket %d [%s] (timeout=%d)", - sd, jk_dump_sinfo(sd, buf), timeout); + sd, jk_dump_sinfo(sd, buf, sizeof(buf)), timeout); } /* Timeout. Set the errno to timeout */ errno = ETIMEDOUT; @@ -1335,7 +1348,7 @@ int jk_is_input_event(jk_sock_t sd, int if (JK_IS_DEBUG_LEVEL(l)) { jk_log(l, JK_LOG_DEBUG, "error during poll on socket %d [%s] (errno=%d)", - sd, jk_dump_sinfo(sd, buf), errno); + sd, jk_dump_sinfo(sd, buf, sizeof(buf)), errno); } errno = save_errno; JK_TRACE_EXIT(l); @@ -1346,7 +1359,7 @@ int jk_is_input_event(jk_sock_t sd, int if (JK_IS_DEBUG_LEVEL(l)) { jk_log(l, JK_LOG_DEBUG, "error event during poll on socket %d [%s] (event=%d)", - sd, jk_dump_sinfo(sd, buf), save_errno); + sd, jk_dump_sinfo(sd, buf, sizeof(buf)), save_errno); } errno = save_errno; JK_TRACE_EXIT(l); @@ -1363,7 +1376,7 @@ int jk_is_input_event(jk_sock_t sd, int struct timeval tv; int rc; int save_errno; - char buf[64]; + char buf[DUMP_SINFO_BUF_SZ]; JK_TRACE_ENTER(l); @@ -1381,7 +1394,7 @@ int jk_is_input_event(jk_sock_t sd, int if (JK_IS_DEBUG_LEVEL(l)) { jk_log(l, JK_LOG_DEBUG, "timeout during select on socket %d [%s] (timeout=%d)", - sd, jk_dump_sinfo(sd, buf), timeout); + sd, jk_dump_sinfo(sd, buf, sizeof(buf)), timeout); } /* Timeout. Set the errno to timeout */ #if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) @@ -1397,7 +1410,7 @@ int jk_is_input_event(jk_sock_t sd, int if (JK_IS_DEBUG_LEVEL(l)) { jk_log(l, JK_LOG_DEBUG, "error during select on socket %d [%s] (errno=%d)", - sd, jk_dump_sinfo(sd, buf), errno); + sd, jk_dump_sinfo(sd, buf, sizeof(buf)), errno); } errno = save_errno; JK_TRACE_EXIT(l); Modified: tomcat/jk/trunk/native/common/jk_connect.h URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_connect.h?rev=1648948&r1=1648947&r2=1648948&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_connect.h (original) +++ tomcat/jk/trunk/native/common/jk_connect.h Thu Jan 1 21:34:22 2015 @@ -55,9 +55,9 @@ int jk_tcp_socket_sendfull(jk_sock_t sd, int jk_tcp_socket_recvfull(jk_sock_t sd, unsigned char *b, int len, jk_logger_t *l); -char *jk_dump_hinfo(jk_sockaddr_t *saddr, char *buf); +char *jk_dump_hinfo(jk_sockaddr_t *saddr, char *buf, size_t size); -char *jk_dump_sinfo(jk_sock_t sd, char *buf); +char *jk_dump_sinfo(jk_sock_t sd, char *buf, size_t size); int jk_is_input_event(jk_sock_t sd, int timeout, jk_logger_t *l); Modified: tomcat/jk/trunk/native/common/jk_status.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_status.c?rev=1648948&r1=1648947&r2=1648948&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_status.c (original) +++ tomcat/jk/trunk/native/common/jk_status.c Thu Jan 1 21:34:22 2015 @@ -1732,10 +1732,10 @@ static void display_maps(jk_ws_service_t JK_TRACE_EXIT(l); } -static const char *dump_ajp_addr(ajp_worker_t *aw, char *buf) +static const char *dump_ajp_addr(ajp_worker_t *aw, char *buf, size_t size) { if (aw->port > 0) - return jk_dump_hinfo(&aw->worker_inet_addr, buf); + return jk_dump_hinfo(&aw->worker_inet_addr, buf, size); else { if (aw->addr_sequence != aw->s->addr_sequence) return "unresolved"; @@ -1760,7 +1760,7 @@ static void display_worker_ajp_conf_deta aw->name, status_worker_type(type), aw->host, - dump_ajp_addr(aw, buf), + dump_ajp_addr(aw, buf, sizeof(buf)), aw->cache_timeout, aw->connect_timeout, aw->prepost_timeout, @@ -1772,7 +1772,7 @@ static void display_worker_ajp_conf_deta jk_printf(s, l, JK_STATUS_SHOW_AJP_CONF_ROW, status_worker_type(type), aw->host, - dump_ajp_addr(aw, buf), + dump_ajp_addr(aw, buf, sizeof(buf)), aw->cache_timeout, aw->connect_timeout, aw->prepost_timeout, @@ -1919,7 +1919,7 @@ static void display_worker_ajp_details(j } jk_print_xml_att_string(s, l, off+2, "host", aw->host); jk_print_xml_att_int(s, l, off+2, "port", aw->port); - jk_print_xml_att_string(s, l, off+2, "address", dump_ajp_addr(aw, buf)); + jk_print_xml_att_string(s, l, off+2, "address", dump_ajp_addr(aw, buf, sizeof(buf))); jk_print_xml_att_int(s, l, off+2, "connection_pool_timeout", aw->cache_timeout); jk_print_xml_att_int(s, l, off+2, "ping_timeout", aw->ping_timeout); jk_print_xml_att_int(s, l, off+2, "connect_timeout", aw->connect_timeout); @@ -1987,7 +1987,7 @@ static void display_worker_ajp_details(j } jk_printf(s, l, " host=%s", aw->host); jk_printf(s, l, " port=%d", aw->port); - jk_printf(s, l, " address=%s", dump_ajp_addr(aw, buf)); + jk_printf(s, l, " address=%s", dump_ajp_addr(aw, buf, sizeof(buf))); jk_printf(s, l, " connection_pool_timeout=%d", aw->cache_timeout); jk_printf(s, l, " ping_timeout=%d", aw->ping_timeout); jk_printf(s, l, " connect_timeout=%d", aw->connect_timeout); @@ -2052,7 +2052,7 @@ static void display_worker_ajp_details(j } jk_print_prop_att_string(s, l, w, ajp_name, "host", aw->host); jk_print_prop_att_int(s, l, w, ajp_name, "port", aw->port); - jk_print_prop_att_string(s, l, w, ajp_name, "address", dump_ajp_addr(aw, buf)); + jk_print_prop_att_string(s, l, w, ajp_name, "address", dump_ajp_addr(aw, buf, sizeof(buf))); jk_print_prop_att_int(s, l, w, ajp_name, "connection_pool_timeout", aw->cache_timeout); jk_print_prop_att_int(s, l, w, ajp_name, "ping_timeout", aw->ping_timeout); jk_print_prop_att_int(s, l, w, ajp_name, "connect_timeout", aw->connect_timeout); Modified: tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml?rev=1648948&r1=1648947&r2=1648948&view=diff ============================================================================== --- tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml (original) +++ tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml Thu Jan 1 21:34:22 2015 @@ -153,6 +153,10 @@ addresses via the status worker if the client encodes ":" as "%3A". Patch contributed by Christopher Schultz. (rjung) </fix> + <fix> + <bug>56452</bug>: Fix crash in debug logging for IPv6 adresses. + Patch contributed by Christopher Schultz. (rjung) + </fix> </changelog> </subsection> </section> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org