From ad155b1f526ccf01c4d6118498a260deec83d1f1 Mon Sep 17 00:00:00 2001 From: Andreas Walter Date: Sun, 9 Feb 2020 19:56:02 +0100 Subject: [PATCH 01/10] use find_package to configure and use OpenSSL Signed-off-by: Andreas Walter --- README.md | 2 +- appveyor.yml | 4 ++- src/CMakeLists.txt | 55 ++++++++------------------------------ src/samples/CMakeLists.txt | 8 +++--- test/CMakeLists.txt | 35 ++---------------------- 5 files changed, 21 insertions(+), 83 deletions(-) diff --git a/README.md b/README.md index 998bb9d9..4d2f9b0b 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ Variable | Default Value | Description PAHO_BUILD_SHARED | TRUE | Build a shared version of the libraries PAHO_BUILD_STATIC | FALSE | Build a static version of the libraries PAHO_WITH_SSL | FALSE | Flag that defines whether to build ssl-enabled binaries too. -OPENSSL_SEARCH_PATH | "" (system default) | Directory containing your OpenSSL installation (i.e. `/usr/local` when headers are in `/usr/local/include` and libraries are in `/usr/local/lib`) +OPENSSL_ROOT_DIR | "" (system default) | Directory containing your OpenSSL installation (i.e. `/usr/local` when headers are in `/usr/local/include` and libraries are in `/usr/local/lib`) PAHO_BUILD_DOCUMENTATION | FALSE | Create and install the HTML based API documentation (requires Doxygen) PAHO_BUILD_SAMPLES | FALSE | Build sample programs MQTT_TEST_BROKER | tcp://localhost:1883 | MQTT connection URL for a broker to use during test execution diff --git a/appveyor.yml b/appveyor.yml index f8f3634f..d0f5d140 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,8 +4,10 @@ environment: matrix: - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 PAHO_WINDOWS_BUILD_BIT: x86 + OPENSSL_ROOT_DIR: "C:/OpenSSL-Win32" - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 PAHO_WINDOWS_BUILD_BIT: x64 + OPENSSL_ROOT_DIR: "C:/OpenSSL-Win64" configuration: Debug install: @@ -32,7 +34,7 @@ build_script: if "%APPVEYOR_BUILD_WORKER_IMAGE%" == "Visual Studio 2013" call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" %PAHO_WINDOWS_BUILD_BIT% - cmake -G "NMake Makefiles" -DPAHO_WITH_SSL=TRUE -DPAHO_BUILD_DOCUMENTATION=FALSE -DPAHO_BUILD_SAMPLES=TRUE -DCMAKE_BUILD_TYPE=Release -DCMAKE_VERBOSE_MAKEFILE=TRUE .. + cmake -G "NMake Makefiles" -DPAHO_WITH_SSL=TRUE -DOPENSSL_ROOT_DIR=%OPENSSL_ROOT_DIR% -DPAHO_BUILD_DOCUMENTATION=FALSE -DPAHO_BUILD_SAMPLES=TRUE -DCMAKE_BUILD_TYPE=Release -DCMAKE_VERBOSE_MAKEFILE=TRUE .. nmake diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 517ab0f9..7ef8619b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -141,48 +141,13 @@ INSTALL(FILES MQTTAsync.h MQTTClient.h MQTTClientPersistence.h MQTTProperties.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) IF (PAHO_WITH_SSL) - SET(OPENSSL_SEARCH_PATH "" CACHE PATH "Directory containing OpenSSL libraries and includes") - - IF (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - IF(OPENSSL_SEARCH_PATH STREQUAL "") - SET(OPENSSL_SEARCH_PATH "/usr/local/opt/openssl") - ENDIF () - ENDIF (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - - IF (WIN32) - IF(OPENSSL_SEARCH_PATH STREQUAL "") - SET(OPENSSL_SEARCH_PATH "C:/OpenSSL-Win64") - SET(OPENSSL_SEARCH_LIB_PATH "${OPENSSL_SEARCH_PATH}/lib64") - IF (DEFINED ENV{PAHO_WINDOWS_BUILD_BIT}) - IF ($ENV{PAHO_WINDOWS_BUILD_BIT} STREQUAL "x86") - SET(OPENSSL_SEARCH_PATH "C:/OpenSSL-Win32") - SET(OPENSSL_SEARCH_LIB_PATH "${OPENSSL_SEARCH_PATH}/lib32") - ENDIF () - ENDIF () - ENDIF () - ELSE() - SET(OPENSSL_SEARCH_LIB_PATH "${OPENSSL_SEARCH_PATH}/lib64") - ENDIF () - - FIND_PATH(OPENSSL_INCLUDE_DIR openssl/ssl.h - HINTS ${OPENSSL_SEARCH_PATH}/include) - FIND_LIBRARY(OPENSSL_LIB NAMES ssl libssl ssleay32 - HINTS ${OPENSSL_SEARCH_PATH}/lib ${OPENSSL_SEARCH_LIB_PATH}) - FIND_LIBRARY(OPENSSLCRYPTO_LIB NAMES crypto libcrypto libeay32 - HINTS ${OPENSSL_SEARCH_PATH}/lib ${OPENSSL_SEARCH_LIB_PATH}) - - MESSAGE(STATUS "OpenSSL hints: ${OPENSSL_SEARCH_PATH}") - MESSAGE(STATUS "OpenSSL headers found at ${OPENSSL_INCLUDE_DIR}") - MESSAGE(STATUS "OpenSSL library found at ${OPENSSL_LIB}") - MESSAGE(STATUS "OpenSSL Crypto library found at ${OPENSSLCRYPTO_LIB}") - - INCLUDE_DIRECTORIES( - ${OPENSSL_INCLUDE_DIR} - ) + SET(OPENSSL_ROOT_DIR "" CACHE PATH "Directory containing OpenSSL libraries and includes") + find_package(OpenSSL REQUIRED) ## common compilation for libpaho-mqtt3cs and libpaho-mqtt3as ## Note: SSL libraries must be recompiled due ifdefs ADD_LIBRARY(common_ssl_obj OBJECT ${common_src}) + TARGET_INCLUDE_DIRECTORIES(common_ssl_obj PUBLIC ${OPENSSL_INCLUDE_DIR}) SET_PROPERTY(TARGET common_ssl_obj PROPERTY POSITION_INDEPENDENT_CODE ON) SET_PROPERTY(TARGET common_ssl_obj PROPERTY COMPILE_DEFINITIONS "OPENSSL=1;MQTT_EXPORTS=1") @@ -190,8 +155,6 @@ IF (PAHO_WITH_SSL) ADD_LIBRARY(paho-mqtt3cs SHARED $ MQTTClient.c SSLSocket.c) ADD_LIBRARY(paho-mqtt3as SHARED $ MQTTAsync.c SSLSocket.c) - TARGET_LINK_LIBRARIES(paho-mqtt3cs ${OPENSSL_LIB} ${OPENSSLCRYPTO_LIB} ${LIBS_SYSTEM}) - TARGET_LINK_LIBRARIES(paho-mqtt3as ${OPENSSL_LIB} ${OPENSSLCRYPTO_LIB} ${LIBS_SYSTEM}) SET_TARGET_PROPERTIES( paho-mqtt3cs paho-mqtt3as PROPERTIES VERSION ${CLIENT_VERSION} @@ -205,6 +168,9 @@ IF (PAHO_WITH_SSL) $ PRIVATE ${CMAKE_BINARY_DIR}) + TARGET_LINK_LIBRARIES(${TARGET} + PUBLIC + OpenSSL::SSL OpenSSL::Crypto ${LIBS_SYSTEM}) ENDFOREACH() INSTALL(TARGETS paho-mqtt3cs paho-mqtt3as EXPORT eclipse-paho-mqtt-cTargets @@ -217,8 +183,6 @@ IF (PAHO_WITH_SSL) ADD_LIBRARY(paho-mqtt3cs-static STATIC $ MQTTClient.c SSLSocket.c) ADD_LIBRARY(paho-mqtt3as-static STATIC $ MQTTAsync.c SSLSocket.c) - TARGET_LINK_LIBRARIES(paho-mqtt3cs-static ${OPENSSL_LIBRARIES} ${LIBS_SYSTEM}) - TARGET_LINK_LIBRARIES(paho-mqtt3as-static ${OPENSSL_LIBRARIES} ${LIBS_SYSTEM}) SET_TARGET_PROPERTIES( paho-mqtt3cs-static paho-mqtt3as-static PROPERTIES VERSION ${CLIENT_VERSION} @@ -247,6 +211,9 @@ IF (PAHO_WITH_SSL) $ PRIVATE ${CMAKE_BINARY_DIR}) + TARGET_LINK_LIBRARIES(${TARGET} + PUBLIC + OpenSSL::SSL OpenSSL::Crypto ${LIBS_SYSTEM}) ENDFOREACH() ENDIF() ENDIF() @@ -269,7 +236,7 @@ ADD_EXECUTABLE( Base64Test EXCLUDE_FROM_ALL Base64.c Base64.h ) TARGET_COMPILE_DEFINITIONS( Base64Test PUBLIC "-DBASE64_TEST" ) IF (PAHO_WITH_SSL) ADD_EXECUTABLE( Base64TestOpenSSL EXCLUDE_FROM_ALL Base64.c Base64.h ) - TARGET_LINK_LIBRARIES( Base64TestOpenSSL ${OPENSSL_LIB} ${OPENSSLCRYPTO_LIB} ) + TARGET_LINK_LIBRARIES( Base64TestOpenSSL OpenSSL::SSL OpenSSL::Crypto) TARGET_COMPILE_DEFINITIONS( Base64TestOpenSSL PUBLIC "-DBASE64_TEST -DOPENSSL=1" ) ENDIF (PAHO_WITH_SSL) @@ -278,6 +245,6 @@ ADD_EXECUTABLE( Sha1Test EXCLUDE_FROM_ALL SHA1.c SHA1.h ) TARGET_COMPILE_DEFINITIONS( Sha1Test PUBLIC "-DSHA1_TEST" ) IF (PAHO_WITH_SSL) ADD_EXECUTABLE( Sha1TestOpenSSL EXCLUDE_FROM_ALL SHA1.c SHA1.h ) - TARGET_LINK_LIBRARIES( Sha1TestOpenSSL ${OPENSSL_LIB} ${OPENSSLCRYPTO_LIB} ) + TARGET_LINK_LIBRARIES( Sha1TestOpenSSL OpenSSL::SSL OpenSSL::Crypto) TARGET_COMPILE_DEFINITIONS( Sha1TestOpenSSL PUBLIC "-DSHA1_TEST -DOPENSSL=1" ) ENDIF (PAHO_WITH_SSL) diff --git a/src/samples/CMakeLists.txt b/src/samples/CMakeLists.txt index 7e329acc..417aeb54 100644 --- a/src/samples/CMakeLists.txt +++ b/src/samples/CMakeLists.txt @@ -73,10 +73,10 @@ ADD_EXECUTABLE(paho_c_sub_static paho_c_sub.c pubsub_opts.c) ADD_EXECUTABLE(paho_cs_pub_static paho_cs_pub.c pubsub_opts.c) ADD_EXECUTABLE(paho_cs_sub_static paho_cs_sub.c pubsub_opts.c) -TARGET_LINK_LIBRARIES(paho_c_pub_static paho-mqtt3as-static ${OPENSSL_LIB} ${OPENSSLCRYPTO_LIB}) -TARGET_LINK_LIBRARIES(paho_c_sub_static paho-mqtt3as-static ${OPENSSL_LIB} ${OPENSSLCRYPTO_LIB}) -TARGET_LINK_LIBRARIES(paho_cs_pub_static paho-mqtt3cs-static ${OPENSSL_LIB} ${OPENSSLCRYPTO_LIB}) -TARGET_LINK_LIBRARIES(paho_cs_sub_static paho-mqtt3cs-static ${OPENSSL_LIB} ${OPENSSLCRYPTO_LIB}) +TARGET_LINK_LIBRARIES(paho_c_pub_static paho-mqtt3as-static) +TARGET_LINK_LIBRARIES(paho_c_sub_static paho-mqtt3as-static) +TARGET_LINK_LIBRARIES(paho_cs_pub_static paho-mqtt3cs-static) +TARGET_LINK_LIBRARIES(paho_cs_sub_static paho-mqtt3cs-static) ENDIF() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index acc0c1bc..1534ea2c 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -7,37 +7,6 @@ SET(MQTT_SSL_HOSTNAME "localhost" CACHE STRING "Hostname of a test SSL MQTT brok SET(CERTDIR ${CMAKE_SOURCE_DIR}/test/ssl) -IF (PAHO_WITH_SSL) - SET(OPENSSL_SEARCH_PATH "" CACHE PATH "Directory containing OpenSSL libraries and includes") - - IF (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - IF(OPENSSL_SEARCH_PATH STREQUAL "") - SET(OPENSSL_SEARCH_PATH "/usr/local/opt/openssl") - ENDIF () - ENDIF (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - - IF (WIN32) - IF(OPENSSL_SEARCH_PATH STREQUAL "") - SET(OPENSSL_SEARCH_PATH "C:/OpenSSL-Win64") - IF (DEFINED ENV{PAHO_WINDOWS_BUILD_BIT}) - IF ($ENV{PAHO_WINDOWS_BUILD_BIT} STREQUAL "x86") - SET(OPENSSL_SEARCH_PATH "C:/OpenSSL-Win32") - ENDIF () - ENDIF () - ENDIF () - ENDIF () - - FIND_PATH(OPENSSL_INCLUDE_DIR openssl/ssl.h - HINTS ${OPENSSL_SEARCH_PATH}/include) - - MESSAGE(STATUS "OpenSSL hints: ${OPENSSL_SEARCH_PATH}") - MESSAGE(STATUS "OpenSSL headers found at ${OPENSSL_INCLUDE_DIR}") - - INCLUDE_DIRECTORIES( - ${OPENSSL_INCLUDE_DIR} - ) -ENDIF () - IF (WIN32) SET(LIBS_SYSTEM ws2_32) ELSEIF (UNIX) @@ -357,7 +326,7 @@ IF (PAHO_WITH_SSL) ) TARGET_LINK_LIBRARIES( test3-static - paho-mqtt3cs-static ${OPENSSL_LIB} ${OPENSSLCRYPTO_LIB} + paho-mqtt3cs-static ) ADD_TEST( @@ -777,7 +746,7 @@ IF (PAHO_WITH_SSL) TARGET_LINK_LIBRARIES( test5-static - paho-mqtt3as-static ${OPENSSL_LIB} ${OPENSSLCRYPTO_LIB} + paho-mqtt3as-static ) ADD_TEST( From 189325cd439edd9d3fe0c2d598a52044aaf8e5ed Mon Sep 17 00:00:00 2001 From: Andreas Walter Date: Sun, 9 Feb 2020 21:06:41 +0100 Subject: [PATCH 02/10] add environment variable for osx build Signed-off-by: Andreas Walter --- .travis.yml | 20 ++++++++------------ travis-build.sh | 6 +++--- travis-env-vars | 2 -- travis-macos-vars | 2 -- 4 files changed, 11 insertions(+), 19 deletions(-) delete mode 100644 travis-env-vars delete mode 100644 travis-macos-vars diff --git a/.travis.yml b/.travis.yml index 5a718362..1394b1ad 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,17 +1,13 @@ sudo: required language: c -compiler: -- gcc -- clang -os: -- linux -- osx -matrix: - exclude: - - compiler: gcc - os: osx - - compiler: clang - os: linux +jobs: + include: + - os: linux + compiler: gcc + env: OPENSSL_ROOT_DIR= + - os: osx + compiler: clang + env: OPENSSL_ROOT_DIR=/usr/local/opt/openssl before_install: #- if [ "$DEPLOY" = "true" ]; then ./travis-setup-deploy.sh; fi - "./travis-install.sh" diff --git a/travis-build.sh b/travis-build.sh index 5ac6bfd5..89846d96 100755 --- a/travis-build.sh +++ b/travis-build.sh @@ -5,9 +5,9 @@ set -e rm -rf build.paho mkdir build.paho cd build.paho -echo "travis build dir $TRAVIS_BUILD_DIR pwd $PWD" -cmake -DCMAKE_BUILD_TYPE=Debug -DPAHO_WITH_SSL=TRUE -DPAHO_BUILD_DOCUMENTATION=FALSE -DPAHO_BUILD_SAMPLES=TRUE .. -make +echo "travis build dir $TRAVIS_BUILD_DIR pwd $PWD with OpenSSL root $OPENSSL_ROOT_DIR" +cmake -DCMAKE_BUILD_TYPE=Debug -DPAHO_WITH_SSL=TRUE -DOPENSSL_ROOT_DIR=$OPENSSL_ROOT_DIR -DPAHO_BUILD_DOCUMENTATION=FALSE -DPAHO_BUILD_SAMPLES=TRUE .. +cmake --build . python3 ../test/mqttsas.py & ctest -VV --timeout 600 cpack --verbose diff --git a/travis-env-vars b/travis-env-vars deleted file mode 100644 index 2551ccb6..00000000 --- a/travis-env-vars +++ /dev/null @@ -1,2 +0,0 @@ -export TRAVIS_OS_NAME=linux -export TRAVIS_BUILD_DIR=$PWD diff --git a/travis-macos-vars b/travis-macos-vars deleted file mode 100644 index bbdbccb5..00000000 --- a/travis-macos-vars +++ /dev/null @@ -1,2 +0,0 @@ -export TRAVIS_OS_NAME=osx -export TRAVIS_BUILD_DIR=$PWD From 2edf7e866b57be50911f818504e183d9858de993 Mon Sep 17 00:00:00 2001 From: Adrian Moran Date: Thu, 5 Mar 2020 14:13:26 +0100 Subject: [PATCH 03/10] Fix alignment with heap tracking (issue #817). Signed-off-by: Adrian Moran --- src/Heap.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Heap.c b/src/Heap.c index 3d28e91c..84b7829f 100644 --- a/src/Heap.c +++ b/src/Heap.c @@ -54,7 +54,7 @@ static mutex_type heap_mutex = &heap_mutex_store; #endif static heap_info state = {0, 0}; /**< global heap state information */ -static int eyecatcher = 0x88888888; +static double eyecatcher = 0x8888888888888888; /*#define HEAP_STACK 1 */ @@ -191,39 +191,39 @@ void* mymalloc(char* file, int line, size_t size) #endif s->line = line; /* Add space for eyecatcher at each end */ - if ((s->ptr = malloc(size + 2*sizeof(int))) == NULL) + if ((s->ptr = malloc(size + 2*sizeof(double))) == NULL) { Log(LOG_ERROR, 13, errmsg); free(s->file); free(s); return NULL; } - memset(s->ptr, 0, size + 2*sizeof(int)); - space += size + 2*sizeof(int); - *(int*)(s->ptr) = eyecatcher; /* start eyecatcher */ - *(int*)(((char*)(s->ptr)) + (sizeof(int) + size)) = eyecatcher; /* end eyecatcher */ + memset(s->ptr, 0, size + 2*sizeof(double)); + space += size + 2*sizeof(double); + *(double*)(s->ptr) = eyecatcher; /* start eyecatcher */ + *(double*)(((char*)(s->ptr)) + (sizeof(double) + size)) = eyecatcher; /* end eyecatcher */ Log(TRACE_MAX, -1, "Allocating %d bytes in heap at file %s line %d ptr %p\n", (int)size, file, line, s->ptr); TreeAdd(&heap, s, space); state.current_size += size; if (state.current_size > state.max_size) state.max_size = state.current_size; Thread_unlock_mutex(heap_mutex); - return ((int*)(s->ptr)) + 1; /* skip start eyecatcher */ + return ((double*)(s->ptr)) + 1; /* skip start eyecatcher */ } static void checkEyecatchers(char* file, int line, void* p, size_t size) { - int *sp = (int*)p; + double *sp = (double*)p; char *cp = (char*)p; - int us; + double us; static const char *msg = "Invalid %s eyecatcher %d in heap item at file %s line %d"; if ((us = *--sp) != eyecatcher) Log(LOG_ERROR, 13, msg, "start", us, file, line); cp += size; - if ((us = *(int*)cp) != eyecatcher) + if ((us = *(double*)cp) != eyecatcher) Log(LOG_ERROR, 13, msg, "end", us, file, line); } @@ -273,7 +273,7 @@ void myfree(char* file, int line, void* p) { Thread_lock_mutex(heap_mutex); if (Internal_heap_unlink(file, line, p)) - free(((int*)p)-1); + free(((double*)p)-1); Thread_unlock_mutex(heap_mutex); } else @@ -329,14 +329,14 @@ void *myrealloc(char* file, int line, void* p, size_t size) state.current_size += size - s->size; if (state.current_size > state.max_size) state.max_size = state.current_size; - if ((s->ptr = realloc(s->ptr, size + 2*sizeof(int))) == NULL) + if ((s->ptr = realloc(s->ptr, size + 2*sizeof(double))) == NULL) { Log(LOG_ERROR, 13, errmsg); return NULL; } - space += size + 2*sizeof(int) - s->size; - *(int*)(s->ptr) = eyecatcher; /* start eyecatcher */ - *(int*)(((char*)(s->ptr)) + (sizeof(int) + size)) = eyecatcher; /* end eyecatcher */ + space += size + 2*sizeof(double) - s->size; + *(double*)(s->ptr) = eyecatcher; /* start eyecatcher */ + *(double*)(((char*)(s->ptr)) + (sizeof(double) + size)) = eyecatcher; /* end eyecatcher */ s->size = size; space -= strlen(s->file); s->file = realloc(s->file, filenamelen); @@ -347,7 +347,7 @@ void *myrealloc(char* file, int line, void* p, size_t size) TreeAdd(&heap, s, space); } Thread_unlock_mutex(heap_mutex); - return (rc == NULL) ? NULL : ((int*)(rc)) + 1; /* skip start eyecatcher */ + return (rc == NULL) ? NULL : ((double*)(rc)) + 1; /* skip start eyecatcher */ } From 6b2a97565c9ecc7069a02f9c9cc4a076441b043f Mon Sep 17 00:00:00 2001 From: Adrian Moran Date: Mon, 9 Mar 2020 11:05:26 +0100 Subject: [PATCH 04/10] Fix Heap.c. Signed-off-by: Adrian Moran --- src/Heap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Heap.c b/src/Heap.c index eefe70e4..02454a54 100644 --- a/src/Heap.c +++ b/src/Heap.c @@ -242,7 +242,7 @@ static int Internal_heap_unlink(char* file, int line, void* p) Node* e = NULL; int rc = 0; - e = TreeFind(&heap, ((int*)p)-1); + e = TreeFind(&heap, ((double*)p)-1); if (e == NULL) Log(LOG_ERROR, 13, "Failed to remove heap item at file %s line %d", file, line); else @@ -318,7 +318,7 @@ void *myrealloc(char* file, int line, void* p, size_t size) storageElement* s = NULL; Thread_lock_mutex(heap_mutex); - s = TreeRemoveKey(&heap, ((int*)p)-1); + s = TreeRemoveKey(&heap, ((double*)p)-1); if (s == NULL) Log(LOG_ERROR, 13, "Failed to reallocate heap item at file %s line %d", file, line); else @@ -364,7 +364,7 @@ void* Heap_findItem(void* p) Node* e = NULL; Thread_lock_mutex(heap_mutex); - e = TreeFind(&heap, ((int*)p)-1); + e = TreeFind(&heap, ((double*)p)-1); Thread_unlock_mutex(heap_mutex); return (e == NULL) ? NULL : e->content; } @@ -384,7 +384,7 @@ static void HeapScan(enum LOG_LEVELS log_level) { storageElement* s = (storageElement*)(current->content); Log(log_level, -1, "Heap element size %d, line %d, file %s, ptr %p", (int)s->size, s->line, s->file, s->ptr); - Log(log_level, -1, " Content %.*s", (10 > current->size) ? (int)s->size : 10, (char*)(((int*)s->ptr) + 1)); + Log(log_level, -1, " Content %.*s", (10 > current->size) ? (int)s->size : 10, (char*)(((double*)s->ptr) + 1)); #if defined(HEAP_STACK) Log(log_level, -1, " Stack:\n%s", s->stack); #endif From e8584027e3443968e1a6966938e0facb774c97b8 Mon Sep 17 00:00:00 2001 From: Adrian Moran Date: Mon, 9 Mar 2020 14:37:54 +0100 Subject: [PATCH 05/10] Define a type for eyecatcher in a way that allows to change it seamlessly). Signed-off-by: Adrian Moran --- src/Heap.c | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/Heap.c b/src/Heap.c index 02454a54..62170363 100644 --- a/src/Heap.c +++ b/src/Heap.c @@ -56,7 +56,9 @@ static mutex_type heap_mutex = &heap_mutex_store; #endif static heap_info state = {0, 0}; /**< global heap state information */ -static double eyecatcher = 0x8888888888888888; + +typedef double eyecatcherType; +static eyecatcherType eyecatcher = 0x8888888888888888; /*#define HEAP_STACK 1 */ @@ -193,39 +195,39 @@ void* mymalloc(char* file, int line, size_t size) #endif s->line = line; /* Add space for eyecatcher at each end */ - if ((s->ptr = malloc(size + 2*sizeof(double))) == NULL) + if ((s->ptr = malloc(size + 2*sizeof(eyecatcherType))) == NULL) { Log(LOG_ERROR, 13, errmsg); free(s->file); free(s); return NULL; } - memset(s->ptr, 0, size + 2*sizeof(double)); - space += size + 2*sizeof(double); - *(double*)(s->ptr) = eyecatcher; /* start eyecatcher */ - *(double*)(((char*)(s->ptr)) + (sizeof(double) + size)) = eyecatcher; /* end eyecatcher */ + memset(s->ptr, 0, size + 2*sizeof(eyecatcherType)); + space += size + 2*sizeof(eyecatcherType); + *(eyecatcherType*)(s->ptr) = eyecatcher; /* start eyecatcher */ + *(eyecatcherType*)(((char*)(s->ptr)) + (sizeof(eyecatcherType) + size)) = eyecatcher; /* end eyecatcher */ Log(TRACE_MAX, -1, "Allocating %d bytes in heap at file %s line %d ptr %p\n", (int)size, file, line, s->ptr); TreeAdd(&heap, s, space); state.current_size += size; if (state.current_size > state.max_size) state.max_size = state.current_size; Thread_unlock_mutex(heap_mutex); - return ((double*)(s->ptr)) + 1; /* skip start eyecatcher */ + return ((eyecatcherType*)(s->ptr)) + 1; /* skip start eyecatcher */ } static void checkEyecatchers(char* file, int line, void* p, size_t size) { - double *sp = (double*)p; + eyecatcherType *sp = (eyecatcherType*)p; char *cp = (char*)p; - double us; + eyecatcherType us; static const char *msg = "Invalid %s eyecatcher %d in heap item at file %s line %d"; if ((us = *--sp) != eyecatcher) Log(LOG_ERROR, 13, msg, "start", us, file, line); cp += size; - if ((us = *(double*)cp) != eyecatcher) + if ((us = *(eyecatcherType*)cp) != eyecatcher) Log(LOG_ERROR, 13, msg, "end", us, file, line); } @@ -242,7 +244,7 @@ static int Internal_heap_unlink(char* file, int line, void* p) Node* e = NULL; int rc = 0; - e = TreeFind(&heap, ((double*)p)-1); + e = TreeFind(&heap, ((eyecatcherType*)p)-1); if (e == NULL) Log(LOG_ERROR, 13, "Failed to remove heap item at file %s line %d", file, line); else @@ -275,7 +277,7 @@ void myfree(char* file, int line, void* p) { Thread_lock_mutex(heap_mutex); if (Internal_heap_unlink(file, line, p)) - free(((double*)p)-1); + free(((eyecatcherType*)p)-1); Thread_unlock_mutex(heap_mutex); } else @@ -318,7 +320,7 @@ void *myrealloc(char* file, int line, void* p, size_t size) storageElement* s = NULL; Thread_lock_mutex(heap_mutex); - s = TreeRemoveKey(&heap, ((double*)p)-1); + s = TreeRemoveKey(&heap, ((eyecatcherType*)p)-1); if (s == NULL) Log(LOG_ERROR, 13, "Failed to reallocate heap item at file %s line %d", file, line); else @@ -331,14 +333,14 @@ void *myrealloc(char* file, int line, void* p, size_t size) state.current_size += size - s->size; if (state.current_size > state.max_size) state.max_size = state.current_size; - if ((s->ptr = realloc(s->ptr, size + 2*sizeof(double))) == NULL) + if ((s->ptr = realloc(s->ptr, size + 2*sizeof(eyecatcherType))) == NULL) { Log(LOG_ERROR, 13, errmsg); return NULL; } - space += size + 2*sizeof(double) - s->size; - *(double*)(s->ptr) = eyecatcher; /* start eyecatcher */ - *(double*)(((char*)(s->ptr)) + (sizeof(double) + size)) = eyecatcher; /* end eyecatcher */ + space += size + 2*sizeof(eyecatcherType) - s->size; + *(eyecatcherType*)(s->ptr) = eyecatcher; /* start eyecatcher */ + *(eyecatcherType*)(((char*)(s->ptr)) + (sizeof(eyecatcherType) + size)) = eyecatcher; /* end eyecatcher */ s->size = size; space -= strlen(s->file); s->file = realloc(s->file, filenamelen); @@ -349,7 +351,7 @@ void *myrealloc(char* file, int line, void* p, size_t size) TreeAdd(&heap, s, space); } Thread_unlock_mutex(heap_mutex); - return (rc == NULL) ? NULL : ((double*)(rc)) + 1; /* skip start eyecatcher */ + return (rc == NULL) ? NULL : ((eyecatcherType*)(rc)) + 1; /* skip start eyecatcher */ } @@ -364,7 +366,7 @@ void* Heap_findItem(void* p) Node* e = NULL; Thread_lock_mutex(heap_mutex); - e = TreeFind(&heap, ((double*)p)-1); + e = TreeFind(&heap, ((eyecatcherType*)p)-1); Thread_unlock_mutex(heap_mutex); return (e == NULL) ? NULL : e->content; } @@ -384,7 +386,7 @@ static void HeapScan(enum LOG_LEVELS log_level) { storageElement* s = (storageElement*)(current->content); Log(log_level, -1, "Heap element size %d, line %d, file %s, ptr %p", (int)s->size, s->line, s->file, s->ptr); - Log(log_level, -1, " Content %.*s", (10 > current->size) ? (int)s->size : 10, (char*)(((double*)s->ptr) + 1)); + Log(log_level, -1, " Content %.*s", (10 > current->size) ? (int)s->size : 10, (char*)(((eyecatcherType*)s->ptr) + 1)); #if defined(HEAP_STACK) Log(log_level, -1, " Stack:\n%s", s->stack); #endif From 0b5f10cd4288547a6238a8e3340365096c29e087 Mon Sep 17 00:00:00 2001 From: Adrian Moran Date: Tue, 10 Mar 2020 10:51:28 +0100 Subject: [PATCH 06/10] Fix test 5 2a. Signed-off-by: Adrian Moran --- test/test5.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test5.c b/test/test5.c index 5348b571..cec059ce 100644 --- a/test/test5.c +++ b/test/test5.c @@ -774,7 +774,7 @@ int test2a(struct Options options) fprintf(xml, " Date: Tue, 10 Mar 2020 12:29:43 +0000 Subject: [PATCH 07/10] Fix up memory allocation refactoring for incoming QoS 2 with MQTT 3.1.1 #817 --- src/MQTTAsync.c | 10 +++++++--- src/MQTTClient.c | 11 ++++++++--- src/MQTTProtocolClient.c | 17 +++++++++++++---- src/MQTTProtocolClient.h | 2 +- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/MQTTAsync.c b/src/MQTTAsync.c index 66e3a086..094cc9b1 100644 --- a/src/MQTTAsync.c +++ b/src/MQTTAsync.c @@ -2775,7 +2775,7 @@ static int MQTTAsync_deliverMessage(MQTTAsyncs* m, char* topicName, size_t topic } -void Protocol_processPublication(Publish* publish, Clients* client) +void Protocol_processPublication(Publish* publish, Clients* client, int allocatePayload) { MQTTAsync_message* mm = NULL; MQTTAsync_message initialized = MQTTAsync_message_initializer; @@ -2785,8 +2785,12 @@ void Protocol_processPublication(Publish* publish, Clients* client) mm = malloc(sizeof(MQTTAsync_message)); memcpy(mm, &initialized, sizeof(MQTTAsync_message)); - mm->payload = malloc(publish->payloadlen); - memcpy(mm->payload, publish->payload, publish->payloadlen); + if (allocatePayload) + { + mm->payload = malloc(publish->payloadlen); + memcpy(mm->payload, publish->payload, publish->payloadlen); + } else + mm->payload = publish->payload; mm->payloadlen = publish->payloadlen; mm->qos = publish->header.bits.qos; mm->retained = publish->header.bits.retain; diff --git a/src/MQTTClient.c b/src/MQTTClient.c index 8d915ea3..44f4b8a2 100644 --- a/src/MQTTClient.c +++ b/src/MQTTClient.c @@ -1052,7 +1052,7 @@ static int MQTTClient_cleanSession(Clients* client) } -void Protocol_processPublication(Publish* publish, Clients* client) +void Protocol_processPublication(Publish* publish, Clients* client, int allocatePayload) { qEntry* qe = NULL; MQTTClient_message* mm = NULL; @@ -1067,8 +1067,13 @@ void Protocol_processPublication(Publish* publish, Clients* client) qe->topicName = publish->topic; qe->topicLen = publish->topiclen; publish->topic = NULL; - mm->payload = malloc(publish->payloadlen); - memcpy(mm->payload, publish->payload, publish->payloadlen); + if (allocatePayload) + { + mm->payload = malloc(publish->payloadlen); + memcpy(mm->payload, publish->payload, publish->payloadlen); + } + else + mm->payload = publish->payload; mm->payloadlen = publish->payloadlen; mm->qos = publish->header.bits.qos; mm->retained = publish->header.bits.retain; diff --git a/src/MQTTProtocolClient.c b/src/MQTTProtocolClient.c index f30df9c4..9676e93f 100644 --- a/src/MQTTProtocolClient.c +++ b/src/MQTTProtocolClient.c @@ -264,6 +264,8 @@ void MQTTProtocol_removePublication(Publications* p) /** * Process an incoming publish packet for a socket + * The payload field of the packet has not been transferred to another buffer at this point. + * If it's needed beyond the scope of this function, it has to be copied. * @param pack pointer to the publish packet * @param sock the socket on which the packet was received * @return completion code @@ -282,7 +284,7 @@ int MQTTProtocol_handlePublishes(void* pack, int sock) publish->header.bits.retain, publish->payloadlen, min(20, publish->payloadlen), publish->payload); if (publish->header.bits.qos == 0) - Protocol_processPublication(publish, client); + Protocol_processPublication(publish, client, 1); else if (!Socket_noPendingWrites(sock)) rc = SOCKET_ERROR; /* queue acks? */ else if (publish->header.bits.qos == 1) @@ -290,7 +292,7 @@ int MQTTProtocol_handlePublishes(void* pack, int sock) /* send puback before processing the publications because a lot of return publications could fill up the socket buffer */ rc = MQTTPacket_send_puback(publish->MQTTVersion, publish->msgId, &client->net, client->clientID); /* if we get a socket error from sending the puback, should we ignore the publication? */ - Protocol_processPublication(publish, client); + Protocol_processPublication(publish, client, 1); } else if (publish->header.bits.qos == 2) { @@ -335,9 +337,16 @@ int MQTTProtocol_handlePublishes(void* pack, int sock) publish1.MQTTVersion = m->MQTTVersion; publish1.properties = m->properties; - Protocol_processPublication(&publish1, client); + Protocol_processPublication(&publish1, client, 1); ListRemove(&(state.publications), m->publish); m->publish = NULL; + } else + { /* allocate and copy payload data as it's needed for pubrel. + For other cases, it's done in Protocol_processPublication */ + char *temp = m->publish->payload; + + m->publish->payload = malloc(m->publish->payloadlen); + memcpy(m->publish->payload, temp, m->publish->payloadlen); } publish->topic = NULL; } @@ -518,7 +527,7 @@ int MQTTProtocol_handlePubrels(void* pack, int sock) if (publish.MQTTVersion >= MQTTVERSION_5) publish.properties = m->properties; else - Protocol_processPublication(&publish, client); /* only for 3.1.1 and lower */ + Protocol_processPublication(&publish, client, 0); /* only for 3.1.1 and lower */ #if !defined(NO_PERSISTENCE) rc += MQTTPersistence_remove(client, (m->MQTTVersion >= MQTTVERSION_5) ? PERSISTENCE_V5_PUBLISH_RECEIVED : PERSISTENCE_PUBLISH_RECEIVED, diff --git a/src/MQTTProtocolClient.h b/src/MQTTProtocolClient.h index 74c3b034..7a407a72 100644 --- a/src/MQTTProtocolClient.h +++ b/src/MQTTProtocolClient.h @@ -37,7 +37,7 @@ Publications* MQTTProtocol_storePublication(Publish* publish, int* len); int messageIDCompare(void* a, void* b); int MQTTProtocol_assignMsgId(Clients* client); void MQTTProtocol_removePublication(Publications* p); -void Protocol_processPublication(Publish* publish, Clients* client); +void Protocol_processPublication(Publish* publish, Clients* client, int allocatePayload); int MQTTProtocol_handlePublishes(void* pack, int sock); int MQTTProtocol_handlePubacks(void* pack, int sock); From 001103f1326c571a6ed4ddfa7e70746d02e191f1 Mon Sep 17 00:00:00 2001 From: Ian Craggs Date: Wed, 11 Mar 2020 10:58:11 +0000 Subject: [PATCH 08/10] Send all WebSocket frames masked #821 --- src/WebSocket.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/WebSocket.c b/src/WebSocket.c index 131248dd..2fda2b27 100644 --- a/src/WebSocket.c +++ b/src/WebSocket.c @@ -474,7 +474,7 @@ void WebSocket_close(networkHandles *net, int status_code, const char *reason) char *buf0; size_t buf0len = sizeof(uint16_t); uint16_t status_code_be; - const int mask_data = 0; + const int mask_data = 1; /* all frames from client must be masked */ if ( status_code < WebSocket_CLOSE_NORMAL || status_code > WebSocket_CLOSE_TLS_FAIL ) @@ -805,11 +805,10 @@ void WebSocket_pong(networkHandles *net, char *app_data, size_t app_data_len) char *buf0 = NULL; size_t buf0len = 0; int freeData = 0; - const int mask_data = 0; + const int mask_data = 1; /* all frames from client must be masked */ - WebSocket_buildFrame( net, WebSocket_OP_PONG, 1, - &buf0, &buf0len, mask_data, &app_data, - &app_data_len); + WebSocket_buildFrame( net, WebSocket_OP_PONG, mask_data, + &buf0, &buf0len, 1, &app_data, &app_data_len); Log(TRACE_PROTOCOL, 1, "Sending WebSocket PONG" ); From 12652217b5f9cb260e5cbc701d506d7601963bb8 Mon Sep 17 00:00:00 2001 From: Ian Craggs Date: Wed, 11 Mar 2020 12:38:38 +0000 Subject: [PATCH 09/10] Remove verbose option from a couple of tests --- test/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 35b4e54f..cc900e21 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -684,7 +684,7 @@ IF (PAHO_BUILD_STATIC) ADD_TEST( NAME test45-7-pending-tokens-static - COMMAND test45-static "--test_no" "7" --verbose "--connection" ${MQTT_TEST_BROKER} + COMMAND test45-static "--test_no" "7" "--connection" ${MQTT_TEST_BROKER} ) ADD_TEST( @@ -747,7 +747,7 @@ IF (PAHO_BUILD_SHARED) ADD_TEST( NAME test45-7-pending-tokens - COMMAND test45 "--test_no" "7" --verbose "--connection" ${MQTT_TEST_BROKER} + COMMAND test45 "--test_no" "7" "--connection" ${MQTT_TEST_BROKER} ) ADD_TEST( From d13651b282c68c831456382684acb7fb338dc00a Mon Sep 17 00:00:00 2001 From: Ian Craggs Date: Wed, 11 Mar 2020 20:55:38 +0000 Subject: [PATCH 10/10] Call initialization routines for shared libraries within CMake build --- src/CMakeLists.txt | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 58d8c7cd..79b8a8c4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -111,6 +111,24 @@ IF (PAHO_BUILD_SHARED) VERSION ${CLIENT_VERSION} SOVERSION ${PAHO_VERSION_MAJOR} DEFINE_SYMBOL "MQTT_EXPORTS") + + IF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") + SET(MQTTCLIENT_ENTRY_POINT _MQTTClient_init) + SET(MQTTASYNC_ENTRY_POINT _MQTTAsync_init) + ELSEIF (NOT WIN32) + SET(MQTTCLIENT_ENTRY_POINT MQTTClient_init) + SET(MQTTASYNC_ENTRY_POINT MQTTAsync_init) + ENDIF() + + IF (NOT WIN32) + SET_TARGET_PROPERTIES( + paho-mqtt3c PROPERTIES + LINK_FLAGS "-Wl,-init,${MQTTCLIENT_ENTRY_POINT}") + SET_TARGET_PROPERTIES( + paho-mqtt3a PROPERTIES + LINK_FLAGS "-Wl,-init,${MQTTASYNC_ENTRY_POINT}") + ENDIF() + FOREACH(TARGET paho-mqtt3c paho-mqtt3a) TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC @@ -186,6 +204,24 @@ IF (PAHO_WITH_SSL) SOVERSION ${PAHO_VERSION_MAJOR} COMPILE_DEFINITIONS "OPENSSL=1" DEFINE_SYMBOL "MQTT_EXPORTS") + + IF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") + SET(MQTTCLIENT_ENTRY_POINT _MQTTClient_init) + SET(MQTTASYNC_ENTRY_POINT _MQTTAsync_init) + ELSEIF (NOT WIN32) + SET(MQTTCLIENT_ENTRY_POINT MQTTClient_init) + SET(MQTTASYNC_ENTRY_POINT MQTTAsync_init) + ENDIF() + + IF (NOT WIN32) + SET_TARGET_PROPERTIES( + paho-mqtt3cs PROPERTIES + LINK_FLAGS "-Wl,-init,${MQTTCLIENT_ENTRY_POINT}") + SET_TARGET_PROPERTIES( + paho-mqtt3as PROPERTIES + LINK_FLAGS "-Wl,-init,${MQTTASYNC_ENTRY_POINT}") + ENDIF() + FOREACH(TARGET paho-mqtt3cs paho-mqtt3as) TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC @@ -219,6 +255,23 @@ IF (PAHO_WITH_SSL) SET_TARGET_PROPERTIES(paho-mqtt3as-static PROPERTIES OUTPUT_NAME paho-mqtt3as) ENDIF() + IF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") + SET(MQTTCLIENT_ENTRY_POINT _MQTTClient_init) + SET(MQTTASYNC_ENTRY_POINT _MQTTAsync_init) + ELSEIF (NOT WIN32) + SET(MQTTCLIENT_ENTRY_POINT MQTTClient_init) + SET(MQTTASYNC_ENTRY_POINT MQTTAsync_init) + ENDIF() + + IF (NOT WIN32) + SET_TARGET_PROPERTIES( + paho-mqtt3cs-static PROPERTIES + LINK_FLAGS "-Wl,-init,${MQTTCLIENT_ENTRY_POINT}") + SET_TARGET_PROPERTIES( + paho-mqtt3as-static PROPERTIES + LINK_FLAGS "-Wl,-init,${MQTTASYNC_ENTRY_POINT}") + ENDIF() + IF (NOT PAHO_BUILD_SHARED) INSTALL(TARGETS paho-mqtt3cs-static paho-mqtt3as-static EXPORT eclipse-paho-mqtt-cTargets