mirror of
https://gitlab.com/openconnect/ocserv.git
synced 2026-02-10 08:46:58 +08:00
connect occurs before sending the fd to worker.
This commit is contained in:
@@ -77,8 +77,7 @@ fail:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int send_udp_fd(main_server_st* s, struct proc_st * proc,
|
||||
void* cli_addr, socklen_t cli_addr_size, int fd)
|
||||
int send_udp_fd(main_server_st* s, struct proc_st * proc, int fd)
|
||||
{
|
||||
struct iovec iov[2];
|
||||
uint8_t cmd = CMD_UDP_FD;
|
||||
@@ -95,10 +94,6 @@ int send_udp_fd(main_server_st* s, struct proc_st * proc,
|
||||
iov[0].iov_len = 1;
|
||||
hdr.msg_iovlen++;
|
||||
|
||||
iov[1].iov_base = cli_addr;
|
||||
iov[1].iov_len = cli_addr_size;
|
||||
hdr.msg_iovlen++;
|
||||
|
||||
hdr.msg_iov = iov;
|
||||
|
||||
hdr.msg_control = control_un.control;
|
||||
|
||||
13
src/main.c
13
src/main.c
@@ -385,7 +385,7 @@ static void handle_term(int signo)
|
||||
#define HANDSHAKE_SESSION_ID_POS 46
|
||||
static int forward_udp_to_owner(main_server_st* s, struct listener_st *listener)
|
||||
{
|
||||
int ret;
|
||||
int ret, e;
|
||||
struct sockaddr_storage cli_addr;
|
||||
struct proc_st *ctmp;
|
||||
socklen_t cli_addr_size;
|
||||
@@ -431,8 +431,15 @@ int connected = 0;
|
||||
|
||||
if (ctmp->udp_fd_received == 0 && session_id_size == ctmp->session_id_size &&
|
||||
memcmp(session_id, ctmp->session_id, session_id_size) == 0) {
|
||||
|
||||
ret = send_udp_fd(s, ctmp, (void*)&cli_addr, cli_addr_size, listener->fd);
|
||||
|
||||
ret = connect(listener->fd, (void*)&cli_addr, cli_addr_size);
|
||||
if (ret == -1) {
|
||||
e = errno;
|
||||
mslog(s, ctmp, LOG_ERR, "connect UDP socket: %s", strerror(e));
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = send_udp_fd(s, ctmp, listener->fd);
|
||||
if (ret < 0) {
|
||||
mslog(s, ctmp, LOG_ERR, "Error passing UDP socket");
|
||||
return -1;
|
||||
|
||||
@@ -81,7 +81,7 @@ void expire_tls_sessions(main_server_st *s);
|
||||
int send_resume_fetch_reply(main_server_st* s, struct proc_st* proc,
|
||||
cmd_resume_reply_t r, struct cmd_resume_fetch_reply_st * reply);
|
||||
|
||||
int send_udp_fd(main_server_st* s, struct proc_st* proc, void* cli_addr, socklen_t cli_addr_size, int fd);
|
||||
int send_udp_fd(main_server_st* s, struct proc_st * proc, int fd);
|
||||
|
||||
int handle_resume_delete_req(main_server_st* s, struct proc_st* proc,
|
||||
const struct cmd_resume_fetch_req_st * req);
|
||||
|
||||
@@ -76,8 +76,8 @@ int handle_worker_commands(struct worker_st *ws)
|
||||
char control[CMSG_SPACE(sizeof(int))];
|
||||
} control_un;
|
||||
struct cmsghdr *cmptr;
|
||||
int ret, e;
|
||||
int cmd_data_len;
|
||||
int ret;
|
||||
/*int cmd_data_len;*/
|
||||
|
||||
memset(&cmd_data, 0, sizeof(cmd_data));
|
||||
|
||||
@@ -104,7 +104,7 @@ int handle_worker_commands(struct worker_st *ws)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
cmd_data_len = ret - 1;
|
||||
/*cmd_data_len = ret - 1;*/
|
||||
|
||||
switch(cmd) {
|
||||
case CMD_TERMINATE:
|
||||
@@ -117,21 +117,10 @@ int handle_worker_commands(struct worker_st *ws)
|
||||
|
||||
if ( (cmptr = CMSG_FIRSTHDR(&hdr)) != NULL && cmptr->cmsg_len == CMSG_LEN(sizeof(int))) {
|
||||
if (cmptr->cmsg_level != SOL_SOCKET)
|
||||
return -1;
|
||||
if (cmptr->cmsg_type != SCM_RIGHTS)
|
||||
return -1;
|
||||
memcpy(&ws->udp_fd, CMSG_DATA(cmptr), sizeof(int));
|
||||
if (cmd_data_len > 0) {
|
||||
ret = connect(ws->udp_fd, (void*)&cmd_data.ss, cmd_data_len);
|
||||
if (ret == -1) {
|
||||
e = errno;
|
||||
oclog(ws, LOG_ERR, "connect(): %s", strerror(e));
|
||||
goto udp_fd_fail;
|
||||
}
|
||||
} else {
|
||||
oclog(ws, LOG_ERR, "didn't receive peer's UDP address");
|
||||
goto udp_fd_fail;
|
||||
}
|
||||
if (cmptr->cmsg_type != SCM_RIGHTS)
|
||||
goto udp_fd_fail;
|
||||
memcpy(&ws->udp_fd, CMSG_DATA(cmptr), sizeof(int));
|
||||
ws->udp_state = UP_SETUP;
|
||||
|
||||
oclog(ws, LOG_DEBUG, "received UDP fd and connected to peer");
|
||||
|
||||
Reference in New Issue
Block a user