mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-30 22:13:49 +00:00
fix #241
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user