diff --git a/src/pxyconn.c b/src/pxyconn.c index c10e11a..1c3cdae 100644 --- a/src/pxyconn.c +++ b/src/pxyconn.c @@ -1160,14 +1160,17 @@ pxy_setup_child_listener(pxy_conn_ctx_t *ctx) return -1; } - // @attention Children are assumed to be listening on an IPv4 address - // @todo IPv6? + // @todo Children are assumed to be listening on an IPv4 address, should we support IPv6 children? char addr[INET_ADDRSTRLEN]; if (!inet_ntop(AF_INET, &child_listener_addr.sin_addr, addr, INET_ADDRSTRLEN)) { pxy_conn_term(ctx, 1); return -1; } + // Port may be 4 or 5 chars long + unsigned int port = ntohs(child_listener_addr.sin_port); + size_t port_len = port < 10000 ? 4 : 5; + if (pxy_set_dstaddr(ctx) == -1) { return -1; } @@ -1177,11 +1180,11 @@ pxy_setup_child_listener(pxy_conn_ctx_t *ctx) // +1 for comma user_len = strlen(ctx->user) + 1; } + // SSLproxy: [127.0.0.1]:34649,[192.168.3.24]:47286,[74.125.206.108]:465,s,soner - // @todo Port may be less than 5 chars - // SSLproxy: + + [ + addr + ] + : + p + , + [ + srchost_str + ] + : + srcport_str + , + [ + dsthost_str + ] + : + dstport_str + , + s + , + user - // SSLPROXY_KEY_LEN + 1 + 1 + strlen(addr) + 1 + 1 + 5 + 1 + 1 + strlen(ctx->srchost_str) + 1 + 1 + strlen(ctx->srcport_str) + 1 + 1 + strlen(ctx->dsthost_str) + 1 + 1 + strlen(ctx->dstport_str) + 1 + 1 + 1 + strlen(ctx->user) - ctx->sslproxy_header_len = SSLPROXY_KEY_LEN + strlen(addr) + strlen(ctx->srchost_str) + strlen(ctx->srcport_str) + strlen(ctx->dsthost_str) + strlen(ctx->dstport_str) + 19 + user_len; + // SSLproxy: + + [ + addr + ] + : + p + , + [ + srchost_str + ] + : + srcport_str + , + [ + dsthost_str + ] + : + dstport_str + , + s + , + user + // SSLPROXY_KEY_LEN + 1 + 1 + strlen(addr) + 1 + 1 + port_len + 1 + 1 + strlen(ctx->srchost_str) + 1 + 1 + strlen(ctx->srcport_str) + 1 + 1 + strlen(ctx->dsthost_str) + 1 + 1 + strlen(ctx->dstport_str) + 1 + 1 + user_len + ctx->sslproxy_header_len = SSLPROXY_KEY_LEN + strlen(addr) + port_len + strlen(ctx->srchost_str) + strlen(ctx->srcport_str) + strlen(ctx->dsthost_str) + strlen(ctx->dstport_str) + 14 + user_len; // +1 for NULL ctx->sslproxy_header = malloc(ctx->sslproxy_header_len + 1); @@ -1192,9 +1195,13 @@ pxy_setup_child_listener(pxy_conn_ctx_t *ctx) // printf(3): "snprintf() will write at most size-1 of the characters (the size'th character then gets the terminating NULL)" // So, +1 for NULL - snprintf(ctx->sslproxy_header, ctx->sslproxy_header_len + 1, "%s [%s]:%u,[%s]:%s,[%s]:%s,%s%s%s", - SSLPROXY_KEY, addr, ntohs(child_listener_addr.sin_port), STRORNONE(ctx->srchost_str), STRORNONE(ctx->srcport_str), - STRORNONE(ctx->dsthost_str), STRORNONE(ctx->dstport_str), ctx->spec->ssl ? "s":"p", user_len ? "," : "", user_len ? ctx->user : ""); + if (snprintf(ctx->sslproxy_header, ctx->sslproxy_header_len + 1, "%s [%s]:%u,[%s]:%s,[%s]:%s,%s%s%s", + SSLPROXY_KEY, addr, port, STRORNONE(ctx->srchost_str), STRORNONE(ctx->srcport_str), + STRORNONE(ctx->dsthost_str), STRORNONE(ctx->dstport_str), ctx->spec->ssl ? "s":"p", user_len ? "," : "", user_len ? ctx->user : "") < 0) { + // ctx->sslproxy_header is freed by pxy_conn_ctx_free() + pxy_conn_term(ctx, 1); + return -1; + } return 0; } @@ -1336,7 +1343,8 @@ pxy_bev_readcb(struct bufferevent *bev, void *arg) } if (!ctx->connected) { - log_err_level_printf(LOG_CRIT, "pxy_bev_readcb: readcb called when not connected - aborting.\n"); + log_err_level_printf(LOG_CRIT, "readcb called when not connected - aborting.\n"); + log_fine("readcb called when not connected - aborting"); log_exceptcb(); return; }