diff --git a/src/W800_SDK_v1.00.10/app/ble/gadget_bridge.c b/src/W800_SDK_v1.00.10/app/ble/gadget_bridge.c index f4539e7..74d79bd 100644 --- a/src/W800_SDK_v1.00.10/app/ble/gadget_bridge.c +++ b/src/W800_SDK_v1.00.10/app/ble/gadget_bridge.c @@ -5,6 +5,7 @@ * over BLE. * @version 0.1 * @date 2023-04-05 + * Updated : 2023-10-15, fixed potential memory leak. * * @copyright MIT * @@ -254,6 +255,10 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void) switch(_gadget_bridge_internals.gadget_bridge_parser_fsm) { case GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE: + + // To prevent a potential memory leak if the parser is fed with bad data + _free_event_data(); + if((start = strstr(_gadget_bridge_internals.buffer, "setTime(")) && (end = strstr(_gadget_bridge_internals.buffer, ");"))) { @@ -1501,29 +1506,24 @@ static void _free_event_data(void) { case GADGET_BRIDGE_EVENT_TYPE_NOTIFY: tls_mem_free(_gadget_bridge_internals.event_data.notification.title); - _gadget_bridge_internals.event_data.notification.title = NULL; tls_mem_free(_gadget_bridge_internals.event_data.notification.body); - _gadget_bridge_internals.event_data.notification.body = NULL; break; case GADGET_BRIDGE_EVENT_TYPE_CALL: tls_mem_free(_gadget_bridge_internals.event_data.call.phone_number); - _gadget_bridge_internals.event_data.call.phone_number = NULL; tls_mem_free(_gadget_bridge_internals.event_data.call.contact); - _gadget_bridge_internals.event_data.call.contact = NULL; break; case GADGET_BRIDGE_EVENT_TYPE_WEATHER: tls_mem_free(_gadget_bridge_internals.event_data.weather.location); - _gadget_bridge_internals.event_data.weather.location = NULL; tls_mem_free(_gadget_bridge_internals.event_data.weather.weather_desc); - _gadget_bridge_internals.event_data.weather.weather_desc = NULL; break; case GADGET_BRIDGE_EVENT_TYPE_MUSIC_INFO: tls_mem_free(_gadget_bridge_internals.event_data.music_info.artist); - _gadget_bridge_internals.event_data.music_info.artist = NULL; tls_mem_free(_gadget_bridge_internals.event_data.music_info.track); - _gadget_bridge_internals.event_data.music_info.track = NULL; break; default: - break; + return; } + // Since we freed any potential event, set the new type as none by setting all fields to 0 + // this also ensures that pointers are set to NULL. + memset(&_gadget_bridge_internals.event_data, 0, sizeof _gadget_bridge_internals.event_data); } diff --git a/src/gadget_bridge_parser/gadget_bridge.c b/src/gadget_bridge_parser/gadget_bridge.c index c6de8b3..ee678b5 100644 --- a/src/gadget_bridge_parser/gadget_bridge.c +++ b/src/gadget_bridge_parser/gadget_bridge.c @@ -5,6 +5,7 @@ * over BLE. * @version 0.1 * @date 2023-04-05 + * Updated : 2023-10-15, fixed potential memory leak. * * @copyright MIT * @@ -14,6 +15,7 @@ #include #include #include +#include //#include "ble_service.h" bool ble_service_send_nus_data(const uint8_t *data, uint16_t length) @@ -249,6 +251,10 @@ gadget_bridge_parser_code_e gadget_bridge_parser_run(void) switch(_gadget_bridge_internals.gadget_bridge_parser_fsm) { case GADGET_BRIDGE_PARSER_FSM_NEW_MESSAGE: + + // To prevent a potential memory leak if the parser is fed with bad data + _free_event_data(); + if((start = strstr(_gadget_bridge_internals.buffer, "setTime(")) && (end = strstr(_gadget_bridge_internals.buffer, ");"))) { @@ -1493,29 +1499,24 @@ static void _free_event_data(void) { case GADGET_BRIDGE_EVENT_TYPE_NOTIFY: free(_gadget_bridge_internals.event_data.notification.title); - _gadget_bridge_internals.event_data.notification.title = NULL; free(_gadget_bridge_internals.event_data.notification.body); - _gadget_bridge_internals.event_data.notification.body = NULL; break; case GADGET_BRIDGE_EVENT_TYPE_CALL: free(_gadget_bridge_internals.event_data.call.phone_number); - _gadget_bridge_internals.event_data.call.phone_number = NULL; free(_gadget_bridge_internals.event_data.call.contact); - _gadget_bridge_internals.event_data.call.contact = NULL; break; case GADGET_BRIDGE_EVENT_TYPE_WEATHER: free(_gadget_bridge_internals.event_data.weather.location); - _gadget_bridge_internals.event_data.weather.location = NULL; free(_gadget_bridge_internals.event_data.weather.weather_desc); - _gadget_bridge_internals.event_data.weather.weather_desc = NULL; break; case GADGET_BRIDGE_EVENT_TYPE_MUSIC_INFO: free(_gadget_bridge_internals.event_data.music_info.artist); - _gadget_bridge_internals.event_data.music_info.artist = NULL; free(_gadget_bridge_internals.event_data.music_info.track); - _gadget_bridge_internals.event_data.music_info.track = NULL; break; default: - break; + return; } + // Since we freed any potential event, set the new type as none by setting all fields to 0 + // this also ensures that pointers are set to NULL. + memset(&_gadget_bridge_internals.event_data, 0, sizeof _gadget_bridge_internals.event_data); } diff --git a/src/gadget_bridge_parser/gadget_bridge_parser.depend b/src/gadget_bridge_parser/gadget_bridge_parser.depend index 80445fd..07a6d99 100644 --- a/src/gadget_bridge_parser/gadget_bridge_parser.depend +++ b/src/gadget_bridge_parser/gadget_bridge_parser.depend @@ -16,18 +16,18 @@ -1684074204 source:d:\users\think\programmation\arduino\git_projects\w800_smart_watch\src\gadget_bridge_parser\gadget_bridge.c +1697318967 source:d:\users\think\programmation\arduino\git_projects\w800_smart_watch\src\gadget_bridge_parser\gadget_bridge.c "gadget_bridge.h" -1684074112 d:\users\think\programmation\arduino\git_projects\w800_smart_watch\src\gadget_bridge_parser\gadget_bridge.h +1684086410 d:\users\think\programmation\arduino\git_projects\w800_smart_watch\src\gadget_bridge_parser\gadget_bridge.h -1684074076 source:d:\users\think\programmation\arduino\git_projects\w800_smart_watch\src\gadget_bridge_parser\main.c +1697358815 source:d:\users\think\programmation\arduino\git_projects\w800_smart_watch\src\gadget_bridge_parser\main.c diff --git a/src/gadget_bridge_parser/gadget_bridge_parser.layout b/src/gadget_bridge_parser/gadget_bridge_parser.layout index 03ccd3c..7a2cad4 100644 --- a/src/gadget_bridge_parser/gadget_bridge_parser.layout +++ b/src/gadget_bridge_parser/gadget_bridge_parser.layout @@ -2,19 +2,19 @@ - + - + - + - + - + - + diff --git a/src/gadget_bridge_parser/main.c b/src/gadget_bridge_parser/main.c index 30874e2..7943f12 100644 --- a/src/gadget_bridge_parser/main.c +++ b/src/gadget_bridge_parser/main.c @@ -320,6 +320,10 @@ const char *sample[] = "ith a very long content ", "to make sure this case i", "s handled in the parser ", + +// Let's simulate bad data to check for robustness +"[16]GB({t:\"notify\",id:", + "and we do not crash the ", "thing because we forgot ", "to handle such a case, d",