From 2d728715982f602ba7851ac3a2e40eddfa765a76 Mon Sep 17 00:00:00 2001 From: 3lswear Date: Sat, 5 Feb 2022 17:13:26 +0300 Subject: [PATCH 1/5] debug: debug output for constructors --- src/Client/Client.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index 34cbd61..c81ecd9 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -4,6 +4,7 @@ Client::Client() { + DBOUT << "Client constructor " << this << ENDL; allRead = false; done = false; this->_fd = -1; @@ -12,6 +13,7 @@ Client::Client() Client::Client(char *str) { + DBOUT << "Client constructor " << this << ENDL; allRead = false; done = false; this->_fd = -1; @@ -22,6 +24,7 @@ Client::Client(char *str) Client::Client(char *str, ServerConfig *config) { + DBOUT << "Client constructor " << this << ENDL; allRead = false; done = false; this->_fd = -1; @@ -239,5 +242,5 @@ void Client::clear(void) Client::~Client() { - DBOUT << "client destructor called" << ENDL; + DBOUT << "client destructor called " << this << ENDL; } From d2637eee79cc19886f7c4667344fc38757c34e1c Mon Sep 17 00:00:00 2001 From: 3lswear Date: Sat, 5 Feb 2022 20:13:02 +0300 Subject: [PATCH 2/5] style: some clean-ups --- src/Server/Server.cpp | 29 +++++++++++++---------------- src/Server/Server.hpp | 1 - 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/Server/Server.cpp b/src/Server/Server.cpp index 8b37e17..1525068 100644 --- a/src/Server/Server.cpp +++ b/src/Server/Server.cpp @@ -11,14 +11,12 @@ Server::Server() { bzero(_events, sizeof(_events)); - _client = 0; } Server::Server(std::string path) { (void)path; - _client = 0; } void Server::print_epoll_events(unsigned int events) @@ -69,8 +67,8 @@ void Server::sendData(Client &client, int fd) else send_len = BUFFSIZE; - /* std::cout << YELLO << tmp << RESET << std::endl; */ - /* std::cout << GREEN << client.getCounter() << RESET << std::endl; */ + /* DBOUT << YELLO << tmp << ENDL; */ + /* DBOUT << GREEN << client.getCounter() << ENDL; */ if (send(fd, tmp + client.getCounter(), send_len, MSG_NOSIGNAL) < 0) @@ -89,7 +87,7 @@ void Server::readSocket(Client &client, int fd) int bytes_read; char buf[BUFFSIZE + 1]; - DBOUT << TURQ << "IN readSocket" << RESET << std::endl; + DBOUT << TURQ << "IN readSocket" << ENDL; DBOUT << "client in readSocket "<< &client << ENDL; bytes_read = recv(fd, buf, BUFFSIZE, 0); if (bytes_read == 0) @@ -108,13 +106,13 @@ void Server::readSocket(Client &client, int fd) client.allRead = true; } - std::cerr << "recvCounter " << client.getRecvCounter() << std::endl; - std::cerr << "contentLength " << client.getRequest().getContentLength() << std::endl; - std::cerr << "allRead " << client.allRead << std::endl; + DBOUT << GREEN << "recvCounter " << client.getRecvCounter() << ENDL; + DBOUT << GREEN << "contentLength " << client.getRequest().getContentLength() << ENDL; + DBOUT << GREEN << "allRead " << client.allRead << ENDL; - DBOUT << BLUE << "status is " << Response::getReasonPhrase(status) << RESET << std::endl; - bzero(buf, BUFFSIZE); + DBOUT << BLUE << "status is " << Response::getReasonPhrase(status) << ENDL; } + int Server::delete_client(std::map &client_map, int fd) { int ret; @@ -149,12 +147,11 @@ void Server::add_to_epoll_list(int fd, unsigned int ep_events) ev.data.fd = fd; assert(epoll_ctl(_epoll_fd, EPOLL_CTL_ADD, fd, &ev) == 0); - _client++; - std::cerr << YELLO + DBOUT << YELLO << "add socket " << fd << " to epoll_list" - << RESET << std::endl; + << ENDL; } void Server::start(void) @@ -178,7 +175,7 @@ void Server::start(void) { ready_num = epoll_wait(_epoll_fd, _events, MAX_CLIENT, -1); - /* std::cout << TURQ << "ready_num " << ready_num << RESET << std::endl; */ + /* DBOUT << TURQ << "ready_num " << ready_num << ENDL; */ if (ready_num < 0) throw std::logic_error("epoll_ret"); @@ -267,11 +264,11 @@ void Server::checkError(int fd, std::string str) { if (fd < 0) { - std::cout << RED << "Server ERROR: " << str << ZERO_C << std::endl; + DBOUT << RED << "Server ERROR: " << str << ENDL; exit(1); } else - std::cout << GREEN << "Server SUCCESS: " << str << ZERO_C << std::endl; + DBOUT << GREEN << "Server SUCCESS: " << str << ENDL; } Server::~Server() diff --git a/src/Server/Server.hpp b/src/Server/Server.hpp index 3a29ec6..429b39f 100644 --- a/src/Server/Server.hpp +++ b/src/Server/Server.hpp @@ -15,7 +15,6 @@ class Server private: int _port; int _epoll_fd; - int _client; struct epoll_event _events[MAX_CLIENT]; struct sockaddr_in _addres; std::string _ip; From b2df81d00dc4bbb8f11265174897b5d723c6196f Mon Sep 17 00:00:00 2001 From: 3lswear Date: Sun, 6 Feb 2022 15:19:09 +0300 Subject: [PATCH 3/5] feat: cleaning intermediate --- src/Server/Server.cpp | 78 ++++++++++++++++++++++++++++++++++++++++++- src/Server/Server.hpp | 3 ++ 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/src/Server/Server.cpp b/src/Server/Server.cpp index 1525068..f403bc2 100644 --- a/src/Server/Server.cpp +++ b/src/Server/Server.cpp @@ -53,6 +53,8 @@ void Server::readConfig(void) _configs.push_back(new ServerConfig(*it)); ++it; } + + clean_parsed(root); } void Server::sendData(Client &client, int fd) @@ -271,7 +273,81 @@ void Server::checkError(int fd, std::string str) DBOUT << GREEN << "Server SUCCESS: " << str << ENDL; } -Server::~Server() +void Server::clean_generic(toml_node *node) { + switch (node->type) + { + case toml_node::STRING: + { + DBOUT << "cleaning string" << ENDL; + delete node->getString(); + delete node; + } + break; + case toml_node::MAPARRAY: + { + DBOUT << "cleaning MAPARRAY" << ENDL; + TOMLMapArray *map_array = node->getMapArray(); + for (TOMLMapArray::iterator it = map_array->begin(); + it != map_array->end(); ++it) + { + TOMLMap *map = *it; + for (TOMLMap::iterator map_it = map->begin(); + map_it != map->end(); ++map_it) + { + clean_generic(map_it->second); + } + } + DBOUT << "end cleaning MAPARRAY" << ENDL; + } + break; + case toml_node::MAP: + { + DBOUT << "cleaning MAP" << ENDL; + TOMLMap *map = node->getMap(); + for (TOMLMap::iterator it = map->begin(); it != map->end(); ++it) + { + DBOUT << "key is " << it->first << ENDL; + clean_generic(it->second); + map->erase(it); + } + map->clear(); + delete node; + DBOUT << "end cleaning MAP" << ENDL; + } + break; + + default: + { + DBOUT << "Cleaning " << node->type << " not implemented :)" << ENDL; + delete node; + } + } + +} + +void Server::clean_parsed(TOMLMap *root) +{ + TOMLMap::iterator it; + + DBOUT << ">>> cleaning up: <<<" << std::endl; + for (it = root->begin(); it != root->end(); ++it) + { + DBOUT << RED << it->first + << ": " << GREEN + << *(it->second->toString()); + + clean_generic(it->second); + /* delete it->second; */ + std::cout << ", " << std::endl; + } + DBOUT << YELLO << "end of clean" << ENDL; + /* delete root; */ + root = NULL; +} + +Server::~Server() +{ + } diff --git a/src/Server/Server.hpp b/src/Server/Server.hpp index 429b39f..f0495a9 100644 --- a/src/Server/Server.hpp +++ b/src/Server/Server.hpp @@ -33,6 +33,9 @@ class Server void readSocket(Client &client, int fd); int delete_client(std::map &map, int fd); + static void clean_generic(toml_node *node); + static void clean_parsed(TOMLMap *root); + enum e_req_status { READING, From 81320af92eb204a1b97eb7a98a3a41fdaada314d Mon Sep 17 00:00:00 2001 From: 3lswear Date: Sun, 6 Feb 2022 19:01:52 +0300 Subject: [PATCH 4/5] fix: leak mitigations --- src/Server/Server.cpp | 42 +++++++++++++++++++++++++++++---------- src/config/TOMLParser.cpp | 9 +++++---- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/Server/Server.cpp b/src/Server/Server.cpp index f403bc2..dbdeabd 100644 --- a/src/Server/Server.cpp +++ b/src/Server/Server.cpp @@ -281,7 +281,6 @@ void Server::clean_generic(toml_node *node) { DBOUT << "cleaning string" << ENDL; delete node->getString(); - delete node; } break; case toml_node::MAPARRAY: @@ -291,13 +290,21 @@ void Server::clean_generic(toml_node *node) for (TOMLMapArray::iterator it = map_array->begin(); it != map_array->end(); ++it) { + DBOUT << "cleaning a MAP of MAPARRAY" << ENDL; TOMLMap *map = *it; - for (TOMLMap::iterator map_it = map->begin(); + TOMLMap::iterator map_it = map->begin(); + for (map_it = map->begin(); map_it != map->end(); ++map_it) { + DBOUT << "cleaning a MAP item " << map_it->first << ENDL; clean_generic(map_it->second); + /* map->erase(map_it); */ } + map->clear(); + delete map; } + map_array->clear(); + delete map_array; DBOUT << "end cleaning MAPARRAY" << ENDL; } break; @@ -309,20 +316,34 @@ void Server::clean_generic(toml_node *node) { DBOUT << "key is " << it->first << ENDL; clean_generic(it->second); - map->erase(it); + /* map->erase(it); */ } map->clear(); - delete node; + delete map; + } + break; + + case toml_node::ARRAY: + { + DBOUT << "cleaning ARRAY" << ENDL; + TOMLArray *arr = node->getArray(); + for (TOMLArray::iterator it = arr->begin(); + it != arr->end(); ++it) + { + clean_generic(*it); + } + arr->clear(); + delete arr; DBOUT << "end cleaning MAP" << ENDL; } break; default: { - DBOUT << "Cleaning " << node->type << " not implemented :)" << ENDL; - delete node; + DBOUT << "Cleaning type " << node->type << " not implemented :)" << ENDL; } } + delete node; } @@ -333,16 +354,17 @@ void Server::clean_parsed(TOMLMap *root) DBOUT << ">>> cleaning up: <<<" << std::endl; for (it = root->begin(); it != root->end(); ++it) { - DBOUT << RED << it->first - << ": " << GREEN - << *(it->second->toString()); + /* DBOUT << RED << it->first */ + /* << ": " << GREEN */ + /* << *(it->second->toString()); */ clean_generic(it->second); /* delete it->second; */ std::cout << ", " << std::endl; } DBOUT << YELLO << "end of clean" << ENDL; - /* delete root; */ + root->clear(); + delete root; root = NULL; } diff --git a/src/config/TOMLParser.cpp b/src/config/TOMLParser.cpp index 6830962..bb2316c 100644 --- a/src/config/TOMLParser.cpp +++ b/src/config/TOMLParser.cpp @@ -444,6 +444,7 @@ namespace config } else (it->second)->getMapArray()->push_back(map_node->getMap()); + delete map_node; } else if (type == toml_node::MAP) { @@ -460,13 +461,13 @@ namespace config { it = local_root->find(*subname); - toml_node *map_node2; - map_node2 = new toml_node; - TOMLMap *map = new TOMLMap; - map_node2->setObject(map); /* subname not found in local_root */ if (it == local_root->end()) { + toml_node *map_node2; + map_node2 = new toml_node; + TOMLMap *map = new TOMLMap; + map_node2->setObject(map); (*local_root)[*subname] = map_node2; local_root = map; } From d94c4495c29c6e1e8218738b8b446f6b18e759bc Mon Sep 17 00:00:00 2001 From: 3lswear Date: Sun, 6 Feb 2022 19:07:30 +0300 Subject: [PATCH 5/5] build: separate debug flags --- Makefile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index ac41cb6..d5f62d4 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,9 @@ SANFLAGS = -fsanitize=address # SANFLAGS = -fsanitize=leak -CXXFLAGS = -Wall -Wextra -Werror -g -std=c++98 -fno-limit-debug-info $(SANFLAGS) -DDEBUG +DEBUGFLAGS = -g -fno-limit-debug-info + +CXXFLAGS = -Wall -Wextra -Werror -std=c++98 $(DEBUGFLAGS) $(SANFLAGS) -DDEBUG CPPFLAGS += -MD -MP @@ -20,12 +22,12 @@ OBJ = $(SRC:.cpp=.o) all: $(NAME) $(OBJ): %.o: %.cpp $(SRC) Makefile - $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -I $(INCLUDES) -o $@ + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -I $(INCLUDES) -o $@ -include $(SRC:%.cpp=%.d) $(NAME): $(OBJ) - $(CXX) $(CXXFLAGS) $(OBJ) -o $(NAME) + $(CXX) $(CXXFLAGS) $(OBJ) -o $(NAME) clean: $(RM) $(OBJ)