mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-02-08 04:10:13 +00:00
Added checks for bad service connection.
This commit is contained in:
parent
24ffb22fa6
commit
fd33e0812c
@ -126,7 +126,7 @@ void handle_error(char *name, char *info, int err)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
dwr("%s()=%d\n", name, err);
|
//dwr("%s()=%d\n", name, err);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,13 +156,15 @@ int checkpid() {
|
|||||||
/*
|
/*
|
||||||
* Sends an RPC command to the service
|
* Sends an RPC command to the service
|
||||||
*/
|
*/
|
||||||
void send_command(int rpc_fd, char *cmd)
|
int send_command(int rpc_fd, char *cmd)
|
||||||
{
|
{
|
||||||
int n_write = write(rpc_fd, cmd, BUF_SZ);
|
int n_write = write(rpc_fd, cmd, BUF_SZ);
|
||||||
if(n_write < 0){
|
if(n_write < 0){
|
||||||
dwr("Error writing command to service (CMD = %d)\n", cmd[0]);
|
dwr("Error writing command to service (CMD = %d)\n", cmd[0]);
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -198,7 +200,8 @@ int is_mapped_to_service(int sockfd)
|
|||||||
memset(cmd, '\0', BUF_SZ);
|
memset(cmd, '\0', BUF_SZ);
|
||||||
cmd[0] = RPC_MAP_REQ;
|
cmd[0] = RPC_MAP_REQ;
|
||||||
memcpy(&cmd[1], &sockfd, sizeof(sockfd));
|
memcpy(&cmd[1], &sockfd, sizeof(sockfd));
|
||||||
send_command(fdret_sock, cmd);
|
if(send_command(fdret_sock, cmd) < 0)
|
||||||
|
return -1;
|
||||||
return get_retval();
|
return get_retval();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -330,16 +333,16 @@ void set_up_intercept()
|
|||||||
int setsockopt(SETSOCKOPT_SIG)
|
int setsockopt(SETSOCKOPT_SIG)
|
||||||
{
|
{
|
||||||
dwr("setsockopt(%d)\n", socket);
|
dwr("setsockopt(%d)\n", socket);
|
||||||
|
if(is_mapped_to_service(socket) < 0) { // First, check if the service manages this
|
||||||
|
return realsetsockopt(socket, level, option_name, option_value, option_len);
|
||||||
|
}
|
||||||
//return(realsetsockopt(socket, level, option_name, option_value, option_len));
|
//return(realsetsockopt(socket, level, option_name, option_value, option_len));
|
||||||
if(level == SOL_IPV6 && option_name == IPV6_V6ONLY)
|
if(level == SOL_IPV6 && option_name == IPV6_V6ONLY)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if(level == SOL_IP && option_name == IP_TTL)
|
if(level == SOL_IP && option_name == IP_TTL)
|
||||||
return 0;
|
return 0;
|
||||||
|
if(level == IPPROTO_TCP || (level == SOL_SOCKET && option_name == SO_KEEPALIVE))
|
||||||
if(level == IPPROTO_TCP || (level == SOL_SOCKET && option_name == SO_KEEPALIVE)){
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
/* make sure we don't touch any standard outputs */
|
/* make sure we don't touch any standard outputs */
|
||||||
if(socket == STDIN_FILENO || socket == STDOUT_FILENO || socket == STDERR_FILENO)
|
if(socket == STDIN_FILENO || socket == STDOUT_FILENO || socket == STDERR_FILENO)
|
||||||
return(realsetsockopt(socket, level, option_name, option_value, option_len));
|
return(realsetsockopt(socket, level, option_name, option_value, option_len));
|
||||||
@ -359,6 +362,9 @@ int setsockopt(SETSOCKOPT_SIG)
|
|||||||
int getsockopt(GETSOCKOPT_SIG)
|
int getsockopt(GETSOCKOPT_SIG)
|
||||||
{
|
{
|
||||||
dwr("getsockopt(%d)\n", sockfd);
|
dwr("getsockopt(%d)\n", sockfd);
|
||||||
|
if(is_mapped_to_service(sockfd) < 0) { // First, check if the service manages this
|
||||||
|
return realgetsockopt(sockfd, level, optname, optval, optlen);
|
||||||
|
}
|
||||||
int err = realgetsockopt(sockfd, level, optname, optval, optlen);
|
int err = realgetsockopt(sockfd, level, optname, optval, optlen);
|
||||||
// FIXME: this condition will need a little more intelligence later on
|
// FIXME: this condition will need a little more intelligence later on
|
||||||
// -- we will need to know if this fd is a local we are spoofing, or a true local
|
// -- we will need to know if this fd is a local we are spoofing, or a true local
|
||||||
@ -760,7 +766,7 @@ int accept(ACCEPT_SIG)
|
|||||||
}
|
}
|
||||||
pthread_mutex_unlock(&lock);
|
pthread_mutex_unlock(&lock);
|
||||||
errno = ERR_OK;
|
errno = ERR_OK;
|
||||||
dwr("accept()=%d\n", new_conn_socket);
|
dwr("*accept()=%d\n", new_conn_socket);
|
||||||
handle_error("accept", "", new_conn_socket);
|
handle_error("accept", "", new_conn_socket);
|
||||||
return new_conn_socket; // OK
|
return new_conn_socket; // OK
|
||||||
}
|
}
|
||||||
@ -770,7 +776,7 @@ int accept(ACCEPT_SIG)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
errno = EBADF; /* necessary? */
|
errno = EBADF;
|
||||||
handle_error("accept", "EBADF - Error reading signal byte from service", -1);
|
handle_error("accept", "EBADF - Error reading signal byte from service", -1);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -813,7 +819,7 @@ int listen(LISTEN_SIG)
|
|||||||
if(sockfd == STDIN_FILENO || sockfd == STDOUT_FILENO || sockfd == STDERR_FILENO)
|
if(sockfd == STDIN_FILENO || sockfd == STDOUT_FILENO || sockfd == STDERR_FILENO)
|
||||||
return(reallisten(sockfd, backlog));
|
return(reallisten(sockfd, backlog));
|
||||||
|
|
||||||
if(!is_mapped_to_service(sockfd)) {
|
if(is_mapped_to_service(sockfd) < 0) {
|
||||||
// We now know this socket is not one of our socketpairs
|
// We now know this socket is not one of our socketpairs
|
||||||
int err = reallisten(sockfd, backlog);
|
int err = reallisten(sockfd, backlog);
|
||||||
dwr("reallisten()=%d\n", err);
|
dwr("reallisten()=%d\n", err);
|
||||||
|
@ -160,5 +160,6 @@ To Test:
|
|||||||
### Alpha Unaddressed bug log
|
### Alpha Unaddressed bug log
|
||||||
|
|
||||||
- Possible CPU max-out during sshd kill or multiple ssh connect/disconnects
|
- Possible CPU max-out during sshd kill or multiple ssh connect/disconnects
|
||||||
|
- sshd will enter an infinite accept loop maxing out CPU if service dies
|
||||||
|
|
||||||
|
|
||||||
|
BIN
netcon/libintercept.so.1.0
Executable file
BIN
netcon/libintercept.so.1.0
Executable file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user