From 6a1bcaad059057ab5de7969ab6b7ddc0b82d2ec1 Mon Sep 17 00:00:00 2001 From: adjoly Date: Fri, 25 Apr 2025 15:22:13 +0200 Subject: [PATCH] =?UTF-8?q?=E3=80=8C=F0=9F=94=A8=E3=80=8D=20fix:=20correct?= =?UTF-8?q?ed=20invalid=20read=20and=20leak?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- includes/server/Client.hpp | 7 ++++++- includes/server/Server.hpp | 11 +++------- src/server/Client.cpp | 4 ++-- src/server/Server.cpp | 43 ++++++++++++++++++++++++-------------- src/server/ServerUtils.cpp | 23 ++++++++------------ 5 files changed, 47 insertions(+), 41 deletions(-) diff --git a/includes/server/Client.hpp b/includes/server/Client.hpp index af899c4..50e25fb 100644 --- a/includes/server/Client.hpp +++ b/includes/server/Client.hpp @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/14 14:14:39 by adjoly #+# #+# */ -/* Updated: 2025/04/25 14:33:54 by adjoly ### ########.fr */ +/* Updated: 2025/04/25 15:15:48 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,9 +37,14 @@ class Client { return true; } + bool isToClose() { + return toClose; + } + private: void _getRequest(std::string); + bool toClose; struct pollfd *_pfd; struct sockaddr_in _client_addr; http::IRequest *_request; diff --git a/includes/server/Server.hpp b/includes/server/Server.hpp index d1e0e22..d0d6ca5 100644 --- a/includes/server/Server.hpp +++ b/includes/server/Server.hpp @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/11 17:45:43 by adjoly #+# #+# */ -/* Updated: 2025/04/25 14:52:50 by adjoly ### ########.fr */ +/* Updated: 2025/04/25 15:16:52 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -41,13 +41,6 @@ class Server { */ void _run(void); - /** - * @brief Used to handle client request - * - * @param the position in the _client_data - */ - bool _handle_client(Client *); - /** * @brief Can be used to fill the vector passed as parameters with all the * port and host in the config @@ -80,6 +73,8 @@ class Server { Client *_getClient(int); + void _destroy_clients(void); + config::Config *_conf; // Pointer to the configuration class (with all config in) Logger *_log; // Pointer to the log class diff --git a/src/server/Client.cpp b/src/server/Client.cpp index fe0ac7b..ac9ff45 100644 --- a/src/server/Client.cpp +++ b/src/server/Client.cpp @@ -6,7 +6,7 @@ /* By: mmoussou _request); } diff --git a/src/server/Server.cpp b/src/server/Server.cpp index db25e65..bdf9a0a 100644 --- a/src/server/Server.cpp +++ b/src/server/Server.cpp @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/11 16:11:40 by adjoly #+# #+# */ -/* Updated: 2025/04/25 14:54:42 by adjoly ### ########.fr */ +/* Updated: 2025/04/25 15:21:43 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,7 +33,7 @@ using namespace webserv::server; extern int _sig; -Client *Server::_getClient(int fd) { +Client *Server::_getClient(int fd) { for (auto it = range(_client_data)) { if (*(*it) == fd) { return *it; @@ -108,6 +108,8 @@ void Server::_run(void) { // to add signal instead of 727 while (727 - sigHandling()) { if (poll(_client_fds.data(), _client_fds.size(), -1) < 0) { + if (errno == EINTR) + continue; std::stringstream str; str << "poll failed : "; str << strerror(errno); @@ -136,27 +138,36 @@ void Server::_run(void) { pfd.events = POLLIN | POLLOUT; pfd.revents = 0; _client_fds.push_back(pfd); - struct pollfd *ppfd = _client_fds.data() + _client_fds.size() -1; - Client *new_client = new Client(ppfd, client_addr, _conf); + struct pollfd *ppfd = _client_fds.data() + _client_fds.size() - 1; + Client *new_client = new Client(ppfd, client_addr, _conf); _client_data.push_back(new_client); } for (size_t i = _fds_server.size(); i < _client_fds.size(); ++i) { - Client *client = _getClient(_client_fds[i].fd); - if (client == not_nullptr) { - _log->error("client does not exist"); - continue; - } - if (_client_fds[i].revents & POLLIN) { - if (_handle_client(client)) { - close(_client_fds[i].fd); - _client_fds.erase(_client_fds.begin() + i); - delete _client_data[i]; - _client_data.erase(_client_data.begin() + i); - i--; + if (_client_fds[i].revents & POLLERR) { + close(_client_fds[i].fd); + _client_fds.erase(_client_fds.begin() + i); + delete _client_data[i - _fds_server.size()]; + _client_data.erase(_client_data.begin() + i); + i--; + } else if (_client_fds[i].revents & POLLIN) { + Client *client = _getClient(_client_fds[i].fd); + if (client == not_nullptr) { + _log->error("client does not exist"); + continue; } + client->parse(); + } else if (_client_fds[i].revents & POLLOUT) { + Client *client = _getClient(_client_fds[i].fd); + if (client == not_nullptr) { + _log->error("client does not exist"); + continue; + } + client->answer(); } } + + _destroy_clients(); } } diff --git a/src/server/ServerUtils.cpp b/src/server/ServerUtils.cpp index cc583b0..be89cee 100644 --- a/src/server/ServerUtils.cpp +++ b/src/server/ServerUtils.cpp @@ -6,12 +6,12 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/17 11:58:42 by adjoly #+# #+# */ -/* Updated: 2025/04/25 14:53:17 by adjoly ### ########.fr */ +/* Updated: 2025/04/25 15:17:55 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ -#include #include +#include #include #include #include @@ -74,22 +74,17 @@ int Server::_createSocket(std::string host, int port) { close(fd); std::ostringstream str; str << port; - throw std::runtime_error("listen failed for : " + host + ":" + str.str()); + throw std::runtime_error("listen failed for : " + host + ":" + + str.str()); } return (fd); } -bool Server::_handle_client(Client *client) { - try { - client->parse(); - client->answer(); - } catch (std::runtime_error &e) { - _log->error(e.what()); - return false; +void Server::_destroy_clients() { + for (auto it = range(_client_data)) { + if ((*it)->isToClose()) { + delete (*it); + } } - - return true; } - -