From fe1f86b84c554666ba088df2a84a98fac4af303b Mon Sep 17 00:00:00 2001 From: Marc Ransome Date: Sat, 30 Nov 2024 11:23:40 +0000 Subject: [PATCH 1/4] Add memory leak and buffer overflow/underflow detection --- src/config.c | 16 ++++++++++++---- src/flog.c | 14 ++++++++++++-- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/config.c b/src/config.c index 73032ec6..db58114a 100644 --- a/src/config.c +++ b/src/config.c @@ -32,12 +32,22 @@ #include #ifdef UNIT_TESTING -extern void mock_assert(const int result, const char* const expression, +extern void mock_assert(const int result, const char * const expression, const char * const file, const int line); #undef assert #define assert(expression) \ mock_assert((int)(expression), #expression, __FILE__, __LINE__); + +extern void * _test_malloc(const size_t size, const char *file, const int line); +extern void * _test_realloc(void *ptr, const size_t size, const char *file, const int line); +extern void * _test_calloc(const size_t number_of_elements, const size_t size, + const char *file, const int line); +extern void _test_free(void * const ptr, const char *file, const int line); + +#define malloc(size) _test_malloc(size, __FILE__, __LINE__) +#define calloc(num, size) _test_calloc(num, size, __FILE__, __LINE__) +#define free(ptr) _test_free(ptr, __FILE__, __LINE__) #endif const int subsystem_len = 257; @@ -90,7 +100,7 @@ flog_config_new(int argc, char *argv[], FlogError *error) { poptReadDefaultConfig(context, 0); int option; - while ((option = poptGetNextOpt(context)) >= 0) { + while ((option = poptGetNextOpt(context)) > 0) { char *option_argument = poptGetOptArg(context); switch (option) { @@ -129,8 +139,6 @@ flog_config_new(int argc, char *argv[], FlogError *error) { flog_config_set_message_type(config, MSG_PRIVATE); break; } - - free(option_argument); } if (option < -1) { diff --git a/src/flog.c b/src/flog.c index 58aa30ba..0f3cadec 100644 --- a/src/flog.c +++ b/src/flog.c @@ -29,12 +29,22 @@ #include "config.h" #ifdef UNIT_TESTING -extern void mock_assert(const int result, const char* const expression, - const char * const file, const int line); +extern void mock_assert(const int result, const char * const expression, + const char * const file, const int line); #undef assert #define assert(expression) \ mock_assert((int)(expression), #expression, __FILE__, __LINE__); + +extern void * _test_malloc(const size_t size, const char *file, const int line); +extern void * _test_realloc(void *ptr, const size_t size, const char *file, const int line); +extern void * _test_calloc(const size_t number_of_elements, const size_t size, + const char *file, const int line); +extern void _test_free(void * const ptr, const char *file, const int line); + +#define malloc(size) _test_malloc(size, __FILE__, __LINE__) +#define calloc(num, size) _test_calloc(num, size, __FILE__, __LINE__) +#define free(ptr) _test_free(ptr, __FILE__, __LINE__) #endif #define OS_LOG_FORMAT_PUBLIC "%{public}s" From 46ac268f2de2e6faf8c12a49f4e42faa14fc84a4 Mon Sep 17 00:00:00 2001 From: Marc Ransome Date: Sat, 30 Nov 2024 11:39:10 +0000 Subject: [PATCH 2/4] Add realloc macro for leak detection --- src/config.c | 1 + src/flog.c | 1 + 2 files changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index db58114a..aeaa437e 100644 --- a/src/config.c +++ b/src/config.c @@ -46,6 +46,7 @@ extern void * _test_calloc(const size_t number_of_elements, const size_t size, extern void _test_free(void * const ptr, const char *file, const int line); #define malloc(size) _test_malloc(size, __FILE__, __LINE__) +#define realloc(ptr, size, file, line) _test_realloc(ptr, size, __FILE__, __LINE__) #define calloc(num, size) _test_calloc(num, size, __FILE__, __LINE__) #define free(ptr) _test_free(ptr, __FILE__, __LINE__) #endif diff --git a/src/flog.c b/src/flog.c index 0f3cadec..02ca2660 100644 --- a/src/flog.c +++ b/src/flog.c @@ -43,6 +43,7 @@ extern void * _test_calloc(const size_t number_of_elements, const size_t size, extern void _test_free(void * const ptr, const char *file, const int line); #define malloc(size) _test_malloc(size, __FILE__, __LINE__) +#define realloc(ptr, size, file, line) _test_realloc(ptr, size, __FILE__, __LINE__) #define calloc(num, size) _test_calloc(num, size, __FILE__, __LINE__) #define free(ptr) _test_free(ptr, __FILE__, __LINE__) #endif From 3bf71576fddd081da3232624c793ad1cfa76d87a Mon Sep 17 00:00:00 2001 From: Marc Ransome Date: Sat, 30 Nov 2024 11:49:06 +0000 Subject: [PATCH 3/4] Add leak detection to common module --- src/common.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/common.c b/src/common.c index 2bf67967..db2dab2a 100644 --- a/src/common.c +++ b/src/common.c @@ -23,6 +23,26 @@ #include "common.h" #include +#ifdef UNIT_TESTING +extern void mock_assert(const int result, const char * const expression, + const char * const file, const int line); + +#undef assert +#define assert(expression) \ + mock_assert((int)(expression), #expression, __FILE__, __LINE__); + +extern void * _test_malloc(const size_t size, const char *file, const int line); +extern void * _test_realloc(void *ptr, const size_t size, const char *file, const int line); +extern void * _test_calloc(const size_t number_of_elements, const size_t size, + const char *file, const int line); +extern void _test_free(void * const ptr, const char *file, const int line); + +#define malloc(size) _test_malloc(size, __FILE__, __LINE__) +#define realloc(ptr, size, file, line) _test_realloc(ptr, size, __FILE__, __LINE__) +#define calloc(num, size) _test_calloc(num, size, __FILE__, __LINE__) +#define free(ptr) _test_free(ptr, __FILE__, __LINE__) +#endif + static const char * flog_error_map[] = { [FLOG_ERROR_NONE] = "none", From 35b3c082200ed6571e47245c5424306a78016f92 Mon Sep 17 00:00:00 2001 From: Marc Ransome Date: Sat, 30 Nov 2024 11:56:10 +0000 Subject: [PATCH 4/4] Consolidate unit test macros and external declarations --- src/common.c | 18 +----------------- src/config.c | 18 +----------------- src/flog.c | 18 +----------------- src/testing.h | 19 +++++++++++++++++++ 4 files changed, 22 insertions(+), 51 deletions(-) create mode 100644 src/testing.h diff --git a/src/common.c b/src/common.c index db2dab2a..63c2955b 100644 --- a/src/common.c +++ b/src/common.c @@ -24,23 +24,7 @@ #include #ifdef UNIT_TESTING -extern void mock_assert(const int result, const char * const expression, - const char * const file, const int line); - -#undef assert -#define assert(expression) \ - mock_assert((int)(expression), #expression, __FILE__, __LINE__); - -extern void * _test_malloc(const size_t size, const char *file, const int line); -extern void * _test_realloc(void *ptr, const size_t size, const char *file, const int line); -extern void * _test_calloc(const size_t number_of_elements, const size_t size, - const char *file, const int line); -extern void _test_free(void * const ptr, const char *file, const int line); - -#define malloc(size) _test_malloc(size, __FILE__, __LINE__) -#define realloc(ptr, size, file, line) _test_realloc(ptr, size, __FILE__, __LINE__) -#define calloc(num, size) _test_calloc(num, size, __FILE__, __LINE__) -#define free(ptr) _test_free(ptr, __FILE__, __LINE__) +#include "testing.h" #endif static const char * diff --git a/src/config.c b/src/config.c index aeaa437e..ac80d204 100644 --- a/src/config.c +++ b/src/config.c @@ -32,23 +32,7 @@ #include #ifdef UNIT_TESTING -extern void mock_assert(const int result, const char * const expression, - const char * const file, const int line); - -#undef assert -#define assert(expression) \ - mock_assert((int)(expression), #expression, __FILE__, __LINE__); - -extern void * _test_malloc(const size_t size, const char *file, const int line); -extern void * _test_realloc(void *ptr, const size_t size, const char *file, const int line); -extern void * _test_calloc(const size_t number_of_elements, const size_t size, - const char *file, const int line); -extern void _test_free(void * const ptr, const char *file, const int line); - -#define malloc(size) _test_malloc(size, __FILE__, __LINE__) -#define realloc(ptr, size, file, line) _test_realloc(ptr, size, __FILE__, __LINE__) -#define calloc(num, size) _test_calloc(num, size, __FILE__, __LINE__) -#define free(ptr) _test_free(ptr, __FILE__, __LINE__) +#include "testing.h" #endif const int subsystem_len = 257; diff --git a/src/flog.c b/src/flog.c index 02ca2660..bee5914f 100644 --- a/src/flog.c +++ b/src/flog.c @@ -29,23 +29,7 @@ #include "config.h" #ifdef UNIT_TESTING -extern void mock_assert(const int result, const char * const expression, - const char * const file, const int line); - -#undef assert -#define assert(expression) \ - mock_assert((int)(expression), #expression, __FILE__, __LINE__); - -extern void * _test_malloc(const size_t size, const char *file, const int line); -extern void * _test_realloc(void *ptr, const size_t size, const char *file, const int line); -extern void * _test_calloc(const size_t number_of_elements, const size_t size, - const char *file, const int line); -extern void _test_free(void * const ptr, const char *file, const int line); - -#define malloc(size) _test_malloc(size, __FILE__, __LINE__) -#define realloc(ptr, size, file, line) _test_realloc(ptr, size, __FILE__, __LINE__) -#define calloc(num, size) _test_calloc(num, size, __FILE__, __LINE__) -#define free(ptr) _test_free(ptr, __FILE__, __LINE__) +#include "testing.h" #endif #define OS_LOG_FORMAT_PUBLIC "%{public}s" diff --git a/src/testing.h b/src/testing.h new file mode 100644 index 00000000..06b43ac2 --- /dev/null +++ b/src/testing.h @@ -0,0 +1,19 @@ +#include + +extern void mock_assert(const int result, const char * const expression, + const char * const file, const int line); + +#undef assert +#define assert(expression) \ + mock_assert((int)(expression), #expression, __FILE__, __LINE__); + +extern void * _test_malloc(const size_t size, const char *file, const int line); +extern void * _test_realloc(void *ptr, const size_t size, const char *file, const int line); +extern void * _test_calloc(const size_t number_of_elements, const size_t size, + const char *file, const int line); +extern void _test_free(void * const ptr, const char *file, const int line); + +#define malloc(size) _test_malloc(size, __FILE__, __LINE__) +#define realloc(ptr, size, file, line) _test_realloc(ptr, size, __FILE__, __LINE__) +#define calloc(num, size) _test_calloc(num, size, __FILE__, __LINE__) +#define free(ptr) _test_free(ptr, __FILE__, __LINE__)