From 4ff6e996380ce2ebd9d16f4e2a3022c3dab980da Mon Sep 17 00:00:00 2001 From: Jessica James Date: Fri, 19 Nov 2021 16:23:38 -0600 Subject: [PATCH] Remove SHARED specifier; fix various compiler warnings when building as static lib; fix a likely crash in HttpServer --- src/common/CMakeLists.txt | 13 ++++- src/common/DataBuffer.cpp | 97 ++++++++++++------------------- src/common/HTTP_Server.cpp | 18 +++--- src/common/SecureSocket.cpp | 28 +++++---- src/common/Socket.cpp | 13 ++++- src/include/Jupiter/Jupiter.h | 8 +-- src/include/Jupiter/Rehash.h | 1 + src/include/Jupiter/String.hpp | 23 +------- src/include/Jupiter/String_Type.h | 4 -- 9 files changed, 91 insertions(+), 114 deletions(-) diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 006cf08..560bbaa 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -24,18 +24,25 @@ set(SOURCE_FILES UDPSocket.cpp) # Setup library build target -add_library(jupiter SHARED ${SOURCE_FILES}) +add_library(jupiter ${SOURCE_FILES}) # Find and link OpenSSL find_package(OpenSSL REQUIRED) target_link_libraries(jupiter OpenSSL::SSL - OpenSSL::Crypto) + OpenSSL::Crypto + ${CMAKE_DL_LIBS}) # Setup include directories target_include_directories(jupiter PUBLIC ../include) target_include_directories(jupiter PRIVATE ../include/Jupiter) target_include_directories(jupiter PRIVATE ${OPENSSL_INCLUDE_DIR}) +# Define JUPITER_SHARED_LIB when compiling shared lib +get_target_property(jupiter_target_type jupiter TYPE) +if (jupiter_target_type STREQUAL "SHARED_LIBRARY") + target_compile_definitions(jupiter PUBLIC JUPITER_SHARED_LIB) +endif() + # Setup platform-specific definitions -target_compile_definitions(jupiter PRIVATE ${JUPITER_PRIVATE_DEFS}) \ No newline at end of file +target_compile_definitions(jupiter PRIVATE ${JUPITER_PRIVATE_DEFS}) diff --git a/src/common/DataBuffer.cpp b/src/common/DataBuffer.cpp index 442830b..6aa5e71 100644 --- a/src/common/DataBuffer.cpp +++ b/src/common/DataBuffer.cpp @@ -21,34 +21,35 @@ #include "DataBuffer.h" #include "Reference_String.h" -Jupiter::DataBuffer::DataBuffer() -{ +Jupiter::DataBuffer::DataBuffer() { Jupiter::DataBuffer::base = nullptr; Jupiter::DataBuffer::head = Jupiter::DataBuffer::base; Jupiter::DataBuffer::end = Jupiter::DataBuffer::head; Jupiter::DataBuffer::bufferSize = 0U; } -Jupiter::DataBuffer::DataBuffer(size_t size_) -{ - Jupiter::DataBuffer::base = reinterpret_cast(malloc(size_)); +Jupiter::DataBuffer::DataBuffer(size_t size_) { + Jupiter::DataBuffer::base = new uint8_t[size_]; Jupiter::DataBuffer::head = Jupiter::DataBuffer::base; Jupiter::DataBuffer::end = Jupiter::DataBuffer::head; Jupiter::DataBuffer::bufferSize = size_; } -Jupiter::DataBuffer::DataBuffer(FILE *file) -{ - fread(std::addressof(Jupiter::DataBuffer::bufferSize), sizeof(size_t), 1, file); - Jupiter::DataBuffer::base = reinterpret_cast(malloc(Jupiter::DataBuffer::bufferSize * sizeof(uint8_t))); +Jupiter::DataBuffer::DataBuffer(FILE *file) { + if (fread(std::addressof(Jupiter::DataBuffer::bufferSize), sizeof(size_t), 1, file) != 1) { + Jupiter::DataBuffer::base = nullptr; + Jupiter::DataBuffer::head = Jupiter::DataBuffer::base; + Jupiter::DataBuffer::end = Jupiter::DataBuffer::head; + Jupiter::DataBuffer::bufferSize = 0U; + return; + } + Jupiter::DataBuffer::base = new uint8_t[Jupiter::DataBuffer::bufferSize * sizeof(uint8_t)]; Jupiter::DataBuffer::head = Jupiter::DataBuffer::base; Jupiter::DataBuffer::end = Jupiter::DataBuffer::head + Jupiter::DataBuffer::bufferSize; int chr; - while (Jupiter::DataBuffer::head != Jupiter::DataBuffer::end) - { + while (Jupiter::DataBuffer::head != Jupiter::DataBuffer::end) { chr = fgetc(file); - if (chr == EOF) - { + if (chr == EOF) { Jupiter::DataBuffer::end = Jupiter::DataBuffer::head + 1; break; } @@ -57,18 +58,15 @@ Jupiter::DataBuffer::DataBuffer(FILE *file) Jupiter::DataBuffer::head = Jupiter::DataBuffer::base; } -Jupiter::DataBuffer::DataBuffer(FILE *file, size_t size_) -{ +Jupiter::DataBuffer::DataBuffer(FILE *file, size_t size_) { Jupiter::DataBuffer::bufferSize = size_; - Jupiter::DataBuffer::base = reinterpret_cast(malloc(Jupiter::DataBuffer::bufferSize * sizeof(uint8_t))); + Jupiter::DataBuffer::base = new uint8_t[Jupiter::DataBuffer::bufferSize * sizeof(uint8_t)]; Jupiter::DataBuffer::head = Jupiter::DataBuffer::base; Jupiter::DataBuffer::end = Jupiter::DataBuffer::head + Jupiter::DataBuffer::bufferSize; int chr; - while (Jupiter::DataBuffer::head != Jupiter::DataBuffer::end) - { + while (Jupiter::DataBuffer::head != Jupiter::DataBuffer::end) { chr = fgetc(file); - if (chr == EOF) - { + if (chr == EOF) { Jupiter::DataBuffer::end = Jupiter::DataBuffer::head + 1; break; } @@ -77,43 +75,37 @@ Jupiter::DataBuffer::DataBuffer(FILE *file, size_t size_) Jupiter::DataBuffer::head = Jupiter::DataBuffer::base; } -Jupiter::DataBuffer::~DataBuffer() -{ - free(Jupiter::DataBuffer::base); +Jupiter::DataBuffer::~DataBuffer() { + delete[] Jupiter::DataBuffer::base; // TODO: replace with std::unique_ptr } -void Jupiter::DataBuffer::push(const uint8_t *data, size_t size_) -{ +void Jupiter::DataBuffer::push(const uint8_t *data, size_t size_) { Jupiter::DataBuffer::secure(size_); while (size_-- != 0) *Jupiter::DataBuffer::end++ = *data++; } -void Jupiter::DataBuffer::peek_from(FILE *file) -{ +void Jupiter::DataBuffer::peek_from(FILE *file) { fpos_t pos; fgetpos(file, &pos); Jupiter::DataBuffer::pop_from(file); fsetpos(file, &pos); } -void Jupiter::DataBuffer::peek_from(FILE *file, size_t size_) -{ +void Jupiter::DataBuffer::peek_from(FILE *file, size_t size_) { fpos_t pos; fgetpos(file, &pos); Jupiter::DataBuffer::pop_from(file, size_); fsetpos(file, &pos); } -void Jupiter::DataBuffer::pop_from(FILE *file) -{ +void Jupiter::DataBuffer::pop_from(FILE *file) { size_t size_; fread(&size_, sizeof(size_t), 1, file); Jupiter::DataBuffer::pop_from(file, size_); } -void Jupiter::DataBuffer::pop_from(FILE *file, size_t size_) -{ +void Jupiter::DataBuffer::pop_from(FILE *file, size_t size_) { Jupiter::DataBuffer::secure(size_); int chr; while (size_-- != 0) @@ -125,38 +117,32 @@ void Jupiter::DataBuffer::pop_from(FILE *file, size_t size_) } } -void Jupiter::DataBuffer::copy_to(FILE *file) -{ +void Jupiter::DataBuffer::copy_to(FILE *file) { size_t data_size = Jupiter::DataBuffer::size(); fwrite(&data_size, sizeof(size_t), 1, file); Jupiter::DataBuffer::copy_to(file, Jupiter::DataBuffer::size()); } -void Jupiter::DataBuffer::copy_to(FILE *file, size_t size_) -{ +void Jupiter::DataBuffer::copy_to(FILE *file, size_t size_) { fwrite(Jupiter::DataBuffer::head, sizeof(uint8_t), size_, file); } -void Jupiter::DataBuffer::copy_to(FILE *file, size_t index, size_t size_) -{ +void Jupiter::DataBuffer::copy_to(FILE *file, size_t index, size_t size_) { fwrite(Jupiter::DataBuffer::head + index, sizeof(uint8_t), size_, file); } -void Jupiter::DataBuffer::push_to(FILE *file) -{ +void Jupiter::DataBuffer::push_to(FILE *file) { Jupiter::DataBuffer::copy_to(file); Jupiter::DataBuffer::head = Jupiter::DataBuffer::base; Jupiter::DataBuffer::end = Jupiter::DataBuffer::head; } -void Jupiter::DataBuffer::push_to(FILE *file, size_t size_) -{ +void Jupiter::DataBuffer::push_to(FILE *file, size_t size_) { Jupiter::DataBuffer::copy_to(file, size_); Jupiter::DataBuffer::head += size_; } -size_t Jupiter::DataBuffer::shrink() -{ +size_t Jupiter::DataBuffer::shrink() { Jupiter::DataBuffer::bufferSize = Jupiter::DataBuffer::size(); if (Jupiter::DataBuffer::base != Jupiter::DataBuffer::head) @@ -168,8 +154,7 @@ size_t Jupiter::DataBuffer::shrink() return Jupiter::DataBuffer::bufferSize; } -size_t Jupiter::DataBuffer::expandBuffer(size_t size_) -{ +size_t Jupiter::DataBuffer::expandBuffer(size_t size_) { Jupiter::DataBuffer::bufferSize += size_; size_ = Jupiter::DataBuffer::end - Jupiter::DataBuffer::head; @@ -182,8 +167,7 @@ size_t Jupiter::DataBuffer::expandBuffer(size_t size_) return Jupiter::DataBuffer::bufferSize; } -void Jupiter::DataBuffer::secure(size_t size_) -{ +void Jupiter::DataBuffer::secure(size_t size_) { size_t data_size = Jupiter::DataBuffer::end - Jupiter::DataBuffer::head; size_ += data_size; if (Jupiter::DataBuffer::bufferSize < size_) @@ -198,8 +182,7 @@ void Jupiter::DataBuffer::secure(size_t size_) } } -void Jupiter::DataBuffer::setBufferSize(size_t size_) -{ +void Jupiter::DataBuffer::setBufferSize(size_t size_) { Jupiter::DataBuffer::bufferSize = size_; size_ = Jupiter::DataBuffer::end - Jupiter::DataBuffer::head; @@ -211,23 +194,19 @@ void Jupiter::DataBuffer::setBufferSize(size_t size_) Jupiter::DataBuffer::end = Jupiter::DataBuffer::head + size_; } -size_t Jupiter::DataBuffer::size() const -{ +size_t Jupiter::DataBuffer::size() const { return Jupiter::DataBuffer::end - Jupiter::DataBuffer::head; } -size_t Jupiter::DataBuffer::getBufferSize() const -{ +size_t Jupiter::DataBuffer::getBufferSize() const { return Jupiter::DataBuffer::bufferSize; } -uint8_t *Jupiter::DataBuffer::getHead() const -{ +uint8_t *Jupiter::DataBuffer::getHead() const { return Jupiter::DataBuffer::head; } -void Jupiter::DataBuffer::empty() -{ +void Jupiter::DataBuffer::empty() { Jupiter::DataBuffer::head = Jupiter::DataBuffer::base; Jupiter::DataBuffer::end = Jupiter::DataBuffer::head; } \ No newline at end of file diff --git a/src/common/HTTP_Server.cpp b/src/common/HTTP_Server.cpp index 9fbe31f..6e8644f 100644 --- a/src/common/HTTP_Server.cpp +++ b/src/common/HTTP_Server.cpp @@ -229,9 +229,9 @@ HTTPSession::~HTTPSession() { struct Jupiter::HTTP::Server::Data { /** Data */ - std::vector> m_hosts; - std::vector> m_ports; - std::vector> m_sessions; + std::vector> m_hosts; // TODO: remove heap allocation, requires move semantics + std::vector> m_ports; // TODO: remove heap allocation, sockets are already pimpl + std::vector> m_sessions; // TODO: consider removing heap allocation std::chrono::milliseconds session_timeout = std::chrono::milliseconds(2000); // TODO: Config variable std::chrono::milliseconds keep_alive_session_timeout = std::chrono::milliseconds(5000); // TODO: Config variable size_t max_request_size = 8192; // TODO: Config variable @@ -706,13 +706,13 @@ int Jupiter::HTTP::Server::think() { auto& session = *itr; if (session->sock.isShutdown()) { if (session->sock.recv() == 0) { - itr = m_data->m_sessions.erase(itr + 1); + itr = m_data->m_sessions.erase(itr); continue; } } else if ((std::chrono::steady_clock::now() > session->last_active + m_data->keep_alive_session_timeout) || (session->keep_alive == false && std::chrono::steady_clock::now() > session->last_active + m_data->session_timeout)) { - itr = m_data->m_sessions.erase(itr + 1); + itr = m_data->m_sessions.erase(itr); continue; } else if (session->sock.recv() > 0) { @@ -723,25 +723,25 @@ int Jupiter::HTTP::Server::think() { session->last_active = std::chrono::steady_clock::now(); m_data->process_request(*session); if (session->keep_alive == false) { // remove completed session - itr = m_data->m_sessions.erase(itr + 1); + itr = m_data->m_sessions.erase(itr); //session->sock.shutdown(); continue; } // else // keep_alive: session not deleted } else if (session->request.size() == m_data->max_request_size) { // reject (full buffer) - itr = m_data->m_sessions.erase(itr + 1); + itr = m_data->m_sessions.erase(itr); continue; } // else // request not over: session not deleted } else { // reject - itr = m_data->m_sessions.erase(itr + 1); + itr = m_data->m_sessions.erase(itr); continue; } } else if (session->sock.getLastError() != JUPITER_SOCK_EWOULDBLOCK) { - itr = m_data->m_sessions.erase(itr + 1); + itr = m_data->m_sessions.erase(itr); continue; } // else // EWOULDBLOCK: session not deleted diff --git a/src/common/SecureSocket.cpp b/src/common/SecureSocket.cpp index 584de28..0e18421 100644 --- a/src/common/SecureSocket.cpp +++ b/src/common/SecureSocket.cpp @@ -117,20 +117,23 @@ void Jupiter::SecureSocket::close() } } -const SSL_METHOD *translateEncryptionMethod(Jupiter::SecureSocket::EncryptionMethod method) -{ - switch (method) - { +const SSL_METHOD *translateEncryptionMethod(Jupiter::SecureSocket::EncryptionMethod method) { + // These are disabled due to deprecations, but also there's not that much reason to actually maintain this method + // since we realistically never use anything except EncryptionMethod::ANY. It was an interesting idea, but there + // just isn't a real use case for these methods. Regardless, better way to implement setMethod/getMethod() would be + // to not provide any abstract implementation at all, and to instead include such option setting as part of some + // OpenSSL provider plugin + switch (method) { //case Jupiter::SecureSocket::EncryptionMethod::SSL3: // return SSLv3_method(); case Jupiter::SecureSocket::EncryptionMethod::TLS1: - return TLSv1_method(); + //return TLSv1_method(); case Jupiter::SecureSocket::EncryptionMethod::TLS1_1: - return TLSv1_1_method(); + //return TLSv1_1_method(); case Jupiter::SecureSocket::EncryptionMethod::TLS1_2: - return TLSv1_2_method(); + //return TLSv1_2_method(); case Jupiter::SecureSocket::EncryptionMethod::DTLS1: - return DTLSv1_method(); + //return DTLSv1_method(); case Jupiter::SecureSocket::EncryptionMethod::ANY: return SSLv23_method(); default: @@ -197,7 +200,7 @@ int Jupiter::SecureSocket::peek() return -1; Jupiter::Socket::Buffer &buffer = this->getInternalBuffer(); buffer.erase(); - int r = SSL_peek(Jupiter::SecureSocket::SSLdata_->handle, buffer.get_str(), this->getBufferSize()); + int r = SSL_peek(Jupiter::SecureSocket::SSLdata_->handle, buffer.get_str(), static_cast(this->getBufferSize())); if (r > 0) buffer.set_length(r); return r; @@ -209,7 +212,7 @@ int Jupiter::SecureSocket::recv() return -1; Jupiter::Socket::Buffer &buffer = this->getInternalBuffer(); buffer.erase(); - int r = SSL_read(Jupiter::SecureSocket::SSLdata_->handle, buffer.get_str(), this->getBufferSize()); + int r = SSL_read(Jupiter::SecureSocket::SSLdata_->handle, buffer.get_str(), static_cast(this->getBufferSize())); if (r > 0) buffer.set_length(r); return r; @@ -217,7 +220,7 @@ int Jupiter::SecureSocket::recv() int Jupiter::SecureSocket::send(const char *data, size_t datalen) { - return SSL_write(Jupiter::SecureSocket::SSLdata_->handle, data, datalen); + return SSL_write(Jupiter::SecureSocket::SSLdata_->handle, data, static_cast(datalen)); } bool Jupiter::SecureSocket::initSSL() @@ -250,6 +253,9 @@ bool Jupiter::SecureSocket::initSSL() ERR_print_errors_fp(stderr); return false; } + + // Not suppressing this warning; descriptor ideally shouldn't be getting shortened here, even if it's "safe" + // TODO: Can't resolve this without removing OpenSSL usage on Windows; we should ideally use Windows APIs if (SSL_set_fd(Jupiter::SecureSocket::SSLdata_->handle, this->getDescriptor()) == 0) { ERR_print_errors_fp(stderr); diff --git a/src/common/Socket.cpp b/src/common/Socket.cpp index 7b3ef82..8d245f0 100644 --- a/src/common/Socket.cpp +++ b/src/common/Socket.cpp @@ -39,6 +39,12 @@ bool socketInit = false; #include "Socket.h" #include "Functions.h" +/** Narrowing conversions; I just don't want to explicitly static_cast parameters to methods that might vary by platform */ +#if defined _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4267) +#endif + void Jupiter::Socket::Buffer::set_length(size_t in_length) { this->length = in_length; @@ -697,4 +703,9 @@ void Jupiter::Socket::setDescriptor(SocketType descriptor) Jupiter::Socket::Buffer &Jupiter::Socket::getInternalBuffer() const { return Jupiter::Socket::data_->buffer; -} \ No newline at end of file +} + +/** Re-enable warnings */ +#if defined _MSC_VER +#pragma warning(pop) +#endif diff --git a/src/include/Jupiter/Jupiter.h b/src/include/Jupiter/Jupiter.h index 1ecc31d..6ae208f 100644 --- a/src/include/Jupiter/Jupiter.h +++ b/src/include/Jupiter/Jupiter.h @@ -24,7 +24,7 @@ * On anything other than Windows, JUPITER_API is defined as nothing, to prevent compiler errors. */ -#if defined _WIN32 +#if defined(_WIN32) && defined(JUPITER_SHARED_LIB) #if defined JUPITER_EXPORTS #define JUPITER_API __declspec(dllexport) @@ -55,11 +55,7 @@ #endif // JUPITER_PLATFORM #if !defined JUPITER_VERSION_SHORT -#if !defined JUPITER_REVISION -#define JUPITER_REVISION -#endif // JUPITER_REVISION - -#define JUPITER_VERSION_SHORT "1.1.0" JUPITER_REVISION +#define JUPITER_VERSION_SHORT "[unversioned]" #endif // JUPITER_VERSION_SHORT #define JUPITER_VERSION "Jupiter " JUPITER_VERSION_SHORT " (" JUPITER_PLATFORM " " __DATE__ ")" /** Version of this program at compile time. */ diff --git a/src/include/Jupiter/Rehash.h b/src/include/Jupiter/Rehash.h index fbacf81..953cdcf 100644 --- a/src/include/Jupiter/Rehash.h +++ b/src/include/Jupiter/Rehash.h @@ -24,6 +24,7 @@ * @brief Provides a C++ rehash system, which is also accessable through a C interface. */ +#include #include "Jupiter.h" namespace Jupiter diff --git a/src/include/Jupiter/String.hpp b/src/include/Jupiter/String.hpp index 0d7f633..442ed89 100644 --- a/src/include/Jupiter/String.hpp +++ b/src/include/Jupiter/String.hpp @@ -273,7 +273,7 @@ namespace Jupiter }; #if defined JUPITER_STRING_STRICT_OPERATOR_PLUS - /** String_Loose Addition Operators */ + /** String_Strict Addition Operators */ template static inline Jupiter::String_Strict operator+(const Jupiter::Readable_String &lhs, const Jupiter::Readable_String &rhs); template static inline Jupiter::String_Strict operator+(const Jupiter::Readable_String &lhs, const T &rhs); template static inline Jupiter::String_Strict operator+(const Jupiter::Readable_String &lhs, const Jupiter::Readable_String &rhs); @@ -561,34 +561,15 @@ namespace Jupiter /** Definition of a Strict String. */ typedef String_Strict StringS; - /** Definition of a Strict Wide String */ - typedef String_Strict WStringS; - /** Definition of a Loose String. */ typedef String_Loose StringL; - /** Definition of a Loose Wide String */ - typedef String_Loose WStringL; - /** Definition of a String. */ typedef StringL String; - /** Definition of a Wide String */ - typedef WStringL WString; - - namespace literals - { + namespace literals { /** String_Strict literals */ inline Jupiter::StringS operator""_jss(const char *str, size_t len) { return Jupiter::StringS(str, len); } - inline Jupiter::WStringS operator""_jwss(const wchar_t *str, size_t len) { return Jupiter::WStringS(str, len); } - - /** String_Loose literals */ - inline Jupiter::StringL operator""_jsl(const char *str, size_t len) { return Jupiter::StringL(str, len); } - inline Jupiter::WStringL operator""_jwsl(const wchar_t *str, size_t len) { return Jupiter::WStringL(str, len); } - - /** String literals */ - inline Jupiter::StringS operator""_js(const char *str, size_t len) { return Jupiter::String(str, len); } - inline Jupiter::WStringS operator""_jws(const wchar_t *str, size_t len) { return Jupiter::WString(str, len); } } // Carried over from Hash_Table.h for compatibility diff --git a/src/include/Jupiter/String_Type.h b/src/include/Jupiter/String_Type.h index a1da273..30ab11e 100644 --- a/src/include/Jupiter/String_Type.h +++ b/src/include/Jupiter/String_Type.h @@ -313,10 +313,6 @@ namespace Jupiter /** Generic String Type */ typedef String_Type StringType; - - /** Generic Wide String Type */ - typedef String_Type WStringType; - } /** Re-enable warning */