From 7951478edfd50d11d99956b140ca0fa67a19fc36 Mon Sep 17 00:00:00 2001 From: whaffman Date: Tue, 21 Oct 2025 15:11:39 +0200 Subject: [PATCH] minimal fix for segfault --- webserv/client/Client.cpp | 15 +++++++++++---- webserv/http/HttpRequest.cpp | 17 ++++++++++++----- webserv/router/Router.cpp | 6 ++++++ 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/webserv/client/Client.cpp b/webserv/client/Client.cpp index 54beb50..0ca3f51 100644 --- a/webserv/client/Client.cpp +++ b/webserv/client/Client.cpp @@ -1,4 +1,5 @@ #include "webserv/handler/CgiHandler.hpp" +#include "webserv/handler/ErrorHandler.hpp" #include "webserv/socket/ASocket.hpp" #include "webserv/socket/CgiSocket.hpp" @@ -86,7 +87,14 @@ void Client::request() }); // server_.responseReady(client_socket_->getFd()); handler_ = router_->handleRequest(); - handler_->handle(); + if (handler_ != nullptr) + { + handler_->handle(); + } + else + { + ErrorHandler::createErrorResponse(500, *httpResponse_); + } } else { @@ -110,7 +118,7 @@ void Client::setCgiSockets(CgiSocket *cgiStdIn, CgiSocket *cgiStdOut) void Client::removeCgiSocket(CgiSocket *cgiSocket) { - server_.remove(*cgiSocket); // write + server_.remove(*cgiSocket); // write sockets_.erase(cgiSocket->getFd()); // sockets_[cgiStdIn->getFd()] = cgiStdIn; @@ -119,7 +127,7 @@ void Client::removeCgiSocket(CgiSocket *cgiSocket) void Client::poll() const { - auto * cgiHandler = dynamic_cast(handler_.get()); + auto *cgiHandler = dynamic_cast(handler_.get()); if (cgiHandler != nullptr) { Log::debug("Polling CGI handler for client, fd: " + std::to_string(clientSocket_->getFd())); @@ -132,7 +140,6 @@ void Client::poll() const clientSocket_->setCallback([this]() { respond(); }); server_.writable(clientSocket_->getFd()); } - } void Client::respond() const diff --git a/webserv/http/HttpRequest.cpp b/webserv/http/HttpRequest.cpp index 009a16f..bf8811c 100644 --- a/webserv/http/HttpRequest.cpp +++ b/webserv/http/HttpRequest.cpp @@ -1,4 +1,5 @@ #include "webserv/config/ConfigManager.hpp" +#include "webserv/config/ServerConfig.hpp" #include "webserv/handler/URI.hpp" #include // for Client @@ -33,9 +34,17 @@ void HttpRequest::setState(State state) { if (state == State::Complete) { - //TODO: segfault if server does not exist + // TODO: segfault if server does not exist + std::string hostHeader = getHeaders().getHost().value_or(""); + ServerConfig *serverConfig = ConfigManager::getInstance().getMatchingServerConfig(hostHeader); + if (hostHeader.empty() || serverConfig == nullptr) + { + Log::error("No matching server config found for host: " + hostHeader); + state_ = State::ParseError; + return; + } uri_ = std::make_unique( - *this, *ConfigManager::getInstance().getMatchingServerConfig(getHeaders().getHost().value_or(""))); + *this, *serverConfig); } state_ = state; } @@ -93,9 +102,7 @@ void HttpRequest::parseBuffer() case State::Complete: Log::debug("HttpRequest::parseBuffer() request is complete"); return; // Request is complete - case State::ParseError: - Log::warning("Parse error occurred, stopping further processing"); - return; + case State::ParseError: Log::warning("Parse error occurred, stopping further processing"); return; } } catch (...) diff --git a/webserv/router/Router.cpp b/webserv/router/Router.cpp index 57ebb87..1164eb7 100644 --- a/webserv/router/Router.cpp +++ b/webserv/router/Router.cpp @@ -38,6 +38,12 @@ std::unique_ptr Router::handleRequest() Log::trace(LOCATION); HttpRequest &request = client_->getHttpRequest(); + if (request.getState() == HttpRequest::State::ParseError) + { + Log::error("Router::handleRequest() called with incomplete request"); + + return nullptr; + } HttpResponse &response = client_->getHttpResponse(); const std::string &target = request.getTarget();