mirror of
https://gitlab.com/openconnect/ocserv.git
synced 2026-02-10 16:57:00 +08:00
sec-mod: do not impose timeouts on reads from main
This commit is contained in:
@@ -404,7 +404,56 @@ static void check_other_work(sec_mod_st *sec)
|
||||
}
|
||||
|
||||
static
|
||||
int serve_request(sec_mod_st *sec, int cfd, unsigned is_main, uint8_t *buffer, unsigned buffer_size)
|
||||
int serve_request_main(sec_mod_st *sec, int cfd, uint8_t *buffer, unsigned buffer_size)
|
||||
{
|
||||
int ret, e;
|
||||
unsigned cmd, length;
|
||||
uint16_t l16;
|
||||
void *pool = buffer;
|
||||
|
||||
/* read request */
|
||||
ret = force_read(cfd, buffer, 3);
|
||||
if (ret == 0)
|
||||
goto leave;
|
||||
else if (ret < 3) {
|
||||
e = errno;
|
||||
seclog(sec, LOG_INFO, "error receiving msg head: %s",
|
||||
strerror(e));
|
||||
ret = ERR_BAD_COMMAND;
|
||||
goto leave;
|
||||
}
|
||||
|
||||
cmd = buffer[0];
|
||||
memcpy(&l16, &buffer[1], 2);
|
||||
length = l16;
|
||||
|
||||
if (length > buffer_size - 4) {
|
||||
seclog(sec, LOG_INFO, "too big message (%d)", length);
|
||||
ret = ERR_BAD_COMMAND;
|
||||
goto leave;
|
||||
}
|
||||
|
||||
/* read the body */
|
||||
ret = force_read(cfd, buffer, length);
|
||||
if (ret < 0) {
|
||||
e = errno;
|
||||
seclog(sec, LOG_INFO, "error receiving msg body: %s",
|
||||
strerror(e));
|
||||
ret = ERR_BAD_COMMAND;
|
||||
goto leave;
|
||||
}
|
||||
|
||||
ret = process_packet_from_main(pool, cfd, sec, cmd, buffer, ret);
|
||||
if (ret < 0) {
|
||||
seclog(sec, LOG_INFO, "error processing data for '%s' command (%d)", cmd_request_to_str(cmd), ret);
|
||||
}
|
||||
|
||||
leave:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static
|
||||
int serve_request(sec_mod_st *sec, int cfd, uint8_t *buffer, unsigned buffer_size)
|
||||
{
|
||||
int ret, e;
|
||||
unsigned cmd, length;
|
||||
@@ -443,10 +492,7 @@ int serve_request(sec_mod_st *sec, int cfd, unsigned is_main, uint8_t *buffer, u
|
||||
goto leave;
|
||||
}
|
||||
|
||||
if (is_main)
|
||||
ret = process_packet_from_main(pool, cfd, sec, cmd, buffer, ret);
|
||||
else
|
||||
ret = process_packet(pool, cfd, sec, cmd, buffer, ret);
|
||||
ret = process_packet(pool, cfd, sec, cmd, buffer, ret);
|
||||
if (ret < 0) {
|
||||
seclog(sec, LOG_INFO, "error processing data for '%s' command (%d)", cmd_request_to_str(cmd), ret);
|
||||
}
|
||||
@@ -677,7 +723,7 @@ void sec_mod_server(void *main_pool, struct perm_cfg_st *perm_config, const char
|
||||
if (buffer == NULL) {
|
||||
seclog(sec, LOG_ERR, "error in memory allocation");
|
||||
} else {
|
||||
ret = serve_request(sec, cmd_fd, 1, buffer, buffer_size);
|
||||
ret = serve_request_main(sec, cmd_fd, buffer, buffer_size);
|
||||
if (ret < 0 && ret == ERR_BAD_COMMAND) {
|
||||
seclog(sec, LOG_ERR, "error processing command from main");
|
||||
exit(1);
|
||||
@@ -710,7 +756,7 @@ void sec_mod_server(void *main_pool, struct perm_cfg_st *perm_config, const char
|
||||
if (buffer == NULL) {
|
||||
seclog(sec, LOG_ERR, "error in memory allocation");
|
||||
} else {
|
||||
serve_request(sec, cfd, 0, buffer, buffer_size);
|
||||
serve_request(sec, cfd, buffer, buffer_size);
|
||||
talloc_free(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user