diff --git a/src/server.c b/src/server.c index 6687fa8d..376d90b1 100644 --- a/src/server.c +++ b/src/server.c @@ -121,6 +121,24 @@ static void free_connections(struct ev_loop *loop) } } +static void report_addr(int fd) { + struct sockaddr_storage addr; + socklen_t len = sizeof addr; + memset(&addr, 0, len); + int err = getpeername(fd, (struct sockaddr *)&addr, &len); + if (err == 0) { + char peer_name[INET6_ADDRSTRLEN] = {0}; + if (addr.ss_family == AF_INET) { + struct sockaddr_in *s = (struct sockaddr_in *)&addr; + dns_ntop(AF_INET, &s->sin_addr, peer_name, INET_ADDRSTRLEN); + } else if (addr.ss_family == AF_INET6) { + struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr; + dns_ntop(AF_INET6, &s->sin6_addr, peer_name, INET6_ADDRSTRLEN); + } + LOGE("failed to handshake with %s", peer_name); + } +} + #ifndef __MINGW32__ int setnonblocking(int fd) { @@ -368,6 +386,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents) if (*buf == NULL) { LOGE("invalid password or cipher"); + report_addr(server->fd); close_and_free_remote(EV_A_ remote); close_and_free_server(EV_A_ server); return; @@ -431,6 +450,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents) offset += in_addr_len; } else { LOGE("invalid header with addr type %d", atyp); + report_addr(server->fd); close_and_free_server(EV_A_ server); return; } @@ -483,6 +503,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents) offset += in6_addr_len; } else { LOGE("invalid header with addr type %d", atyp); + report_addr(server->fd); close_and_free_server(EV_A_ server); return; } @@ -496,6 +517,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents) if (offset == 1) { LOGE("invalid header with addr type %d", atyp); + report_addr(server->fd); close_and_free_server(EV_A_ server); return; } @@ -764,6 +786,7 @@ static void remote_send_cb(EV_P_ ev_io *w, int revents) struct sockaddr_storage addr; socklen_t len = sizeof addr; + memset(&addr, 0, len); int r = getpeername(remote->fd, (struct sockaddr *)&addr, &len); if (r == 0) { if (verbose) {