From 4cd42a578add9941470e599cbcb4e8cd713d4c51 Mon Sep 17 00:00:00 2001 From: Denis Morozov Date: Mon, 30 Dec 2024 00:18:56 +0500 Subject: [PATCH 1/8] Fix incoming command handler --- dozord/main.c | 4 ++-- libdozor/libdozor.c | 47 ++++++++++++--------------------------------- 2 files changed, 14 insertions(+), 37 deletions(-) diff --git a/dozord/main.c b/dozord/main.c index ca2ddc8..54f5e98 100644 --- a/dozord/main.c +++ b/dozord/main.c @@ -184,7 +184,7 @@ on_message_t socket_message_callback(CommandResponse * response, uint8_t * data, short int found = getNextCommandIdx(commands); if (found != -1) { snprintf(logMessage, sizeof(logMessage), "Sending cmd - \"%s\"", commands->items[found].value); - prettyLogger(LOG_LEVEL_INFO, "-", logMessage); + prettyLogger(LOG_LEVEL_INFO, clientIp, logMessage); res = dozor_pack(response, crypto, commands->items[found].id, commands->items[found].value); // @todo mark command as "sent", make it "done" once device returns command execution result @@ -213,7 +213,7 @@ on_message_t socket_message_callback(CommandResponse * response, uint8_t * data, } } else { snprintf(logMessage, sizeof(logMessage), "Unable to unpack events! Error code - %d. Freeing memory...", events->errorCode); - prettyLogger(LOG_LEVEL_DEBUG, "-", logMessage); + prettyLogger(LOG_LEVEL_INFO, clientIp, logMessage); // @todo handle error code value free(payload->deviceIp); diff --git a/libdozor/libdozor.c b/libdozor/libdozor.c index fa94dac..d4bf587 100644 --- a/libdozor/libdozor.c +++ b/libdozor/libdozor.c @@ -169,8 +169,8 @@ unsigned short int dozor_pack( char * commandValue ) { - int n; - unsigned short int answerLength, index; + + unsigned short int answerLength; uint8_t * ptr; char * answer; char * cmdValue; @@ -186,7 +186,10 @@ unsigned short int dozor_pack( fprintf(stderr, "***libdozor.c: Unable to allocate memory for response: %s\n", strerror(errno)); return -1; } - + response->time = time(NULL) - DATE_TIME_OFFSET; + response->unknownOne = 0; + response->unknownTwo = 0x7c; + cmdValue = malloc(sizeof(char) * 32); if (cmdValue == NULL) { @@ -195,15 +198,13 @@ unsigned short int dozor_pack( return -1; } - response->time = time(NULL) - DATE_TIME_OFFSET; - response->unknownOne = 0; - response->unknownTwo = 0x7c; - if ((strlen(commandValue) > 1) && (commandId > 0)) - { + { + sprintf(cmdValue, "%s&%08x", commandValue, __builtin_bswap32(commandId)); logger(LOG_LEVEL_DEBUG, "libdozor", "New command - %s", cmdValue); } else { - strcpy(cmdValue, DEFAULT_ANSWER); + strncpy(cmdValue, DEFAULT_ANSWER, 31); + cmdValue[31] = '\0'; } answerLength = strlen(cmdValue) + 2; @@ -217,48 +218,24 @@ unsigned short int dozor_pack( return -1; } - memcpy(answer, cmdValue, answerLength); + snprintf(answer, answerLength, "%s!", cmdValue); + free(cmdValue); - strcat(answer, "!"); - logger(LOG_LEVEL_DEBUG, "libdozor", "command - %s (%d)", answer, answerLength); memcpy(response->encrypted, answer, sizeof(char) * answerLength); if (encrypt(response->encrypted, crypto, answerLength) != 0) { - free(cmdValue); free(response); fprintf(stderr, "Unable to encrypt message:\"%s\" %s\n", answer, strerror(errno)); free(answer); return -1; } - // if (debugMode) - // { - // ptr = (uint8_t*) response->encrypted; - // printf("\n***libdozor.c: encrypted response: "); - // for (index = 0; index < answerLength; index++) - // { - // printf("%02X", *(ptr + index)); - // } - // printf("\n"); - - // ptr = (uint8_t*) response; - // printf("\n***libdozor.c: response: "); - // for (index = 0; index < answerLength + 6; index++) - // { - // printf("%02X", *(ptr + index)); - // } - // printf("\n"); - // } - memcpy(&command->response, response, sizeof(DozorResponse)); command->responseLength = answerLength + 6; - free(cmdValue); - logger(LOG_LEVEL_DEBUG, "libdozor", "cmdValue freed"); - free(answer); logger(LOG_LEVEL_DEBUG, "libdozor", "answer freed"); From 8eedc1c8bdd66fd5f367fed6f7b0c6887b255b0b Mon Sep 17 00:00:00 2001 From: Denis Morozov Date: Mon, 30 Dec 2024 00:39:21 +0500 Subject: [PATCH 2/8] Fix memory leaks --- libdozor/event.c | 66 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 13 deletions(-) diff --git a/libdozor/event.c b/libdozor/event.c index 57b4a54..6aa3c96 100644 --- a/libdozor/event.c +++ b/libdozor/event.c @@ -363,10 +363,16 @@ static char * getFirmwareVersionEventData(uint8_t type, uint8_t * data, uint8_t char * template = ",\"event\":\"%s\",\"scope\":\"Common\",\"version\":\"%ld.%s\""; char * res; char * subVersion = getData(data, DEFAULT_DATA_POSITION, len); - long int version = strtol(getData(data, VERSION_DATA_POSITION, len), 0, 10) & VERSION_MASK; + char * subVersionData = getData(data, VERSION_DATA_POSITION, len); + long int version = strtol(subVersionData, 0, 10) & VERSION_MASK; + char * eventName = getEventNameByType(type); res = malloc(sizeof(char) * (strlen(template) + MAX_EVENT_NAME_LENGTH + 4)); - sprintf(res, template, getEventNameByType(type), version, subVersion); + sprintf(res, template, eventName, version, subVersion); + + free(subVersion); + free(subVersionData); + free(eventName); return res; } @@ -384,8 +390,14 @@ static char * getCommandEventData(uint8_t type, uint8_t * data, uint8_t len) char * cmdId = getData(data, DEFAULT_DATA_POSITION, len); logger(LOG_LEVEL_DEBUG, "event.c(getCommandEventData)", "command id %s, position - %d, length - %d", cmdId, DEFAULT_DATA_POSITION, len); + char * eventName = getEventNameByType(type); + res = malloc(sizeof(char) * (strlen(template) + MAX_EVENT_NAME_LENGTH + MAX_COMMAND_RESULT_NAME_LENGTH + 4)); - sprintf(res, template, getEventNameByType(type), cmdId, cmdResult, cmdResultName); + sprintf(res, template, eventName, cmdId, cmdResult, cmdResultName); + + free(cmdResult); + free(cmdId); + free(eventName); return res; } @@ -394,8 +406,13 @@ static char * getReportEventData(uint8_t type, uint8_t * data, uint8_t len) { char * template = ",\"temp\":%s,\"event\":\"%s\",\"scope\":\"Common\""; char * res = malloc(sizeof(char) * (strlen(template) + MAX_EVENT_NAME_LENGTH + 2)); - - sprintf(res, template, getData(data, REPORT_TEMP_DATA_POSITION, len), getEventNameByType(type)); + char * extractedData = getData(data, REPORT_TEMP_DATA_POSITION, len); + char * eventName = getEventNameByType(type); + + sprintf(res, template, extractedData, eventName); + + free(extractedData); + free(eventName); return res; } @@ -404,8 +421,13 @@ static char * getAuthEventData(uint8_t type, uint8_t * data, uint8_t len) { char * template = ",\"user\":%s,\"event\":\"%s\",\"scope\":\"Auth\""; char * res = malloc(sizeof(char) * (strlen(template) + MAX_EVENT_NAME_LENGTH + 2)); + char * extractedData = getData(data, DEFAULT_DATA_POSITION, len); + char * eventName = getEventNameByType(type); + + sprintf(res, template, extractedData, eventName); - sprintf(res, template, getData(data, DEFAULT_DATA_POSITION, len), getEventNameByType(type)); + free(extractedData); + free(eventName); return res; } @@ -414,8 +436,13 @@ static char * getSecurityEventData(uint8_t type, uint8_t * data, uint8_t len) { char * template = ",\"user\":%s,\"event\":\"%s\",\"scope\":\"Security\""; char * res = malloc(sizeof(char) * (strlen(template) + MAX_EVENT_NAME_LENGTH + 2)); - - sprintf(res, template, getData(data, USER_DATA_POSITION, len), getEventNameByType(type)); + char * extractedData = getData(data, USER_DATA_POSITION, len); + char * eventName = getEventNameByType(type); + + sprintf(res, template, extractedData, eventName); + + free(extractedData); + free(eventName); return res; } @@ -424,8 +451,13 @@ static char * getZoneEventData(uint8_t type, uint8_t * data, uint8_t len) { char * template = ",\"zone\":%s,\"event\":\"%s\",\"scope\":\"Zone\""; char * res = malloc(sizeof(char) * (strlen(template) + MAX_EVENT_NAME_LENGTH + 2)); - - sprintf(res, template, getData(data, DEFAULT_DATA_POSITION, len), getEventNameByType(type)); + char * extractedData = getData(data, DEFAULT_DATA_POSITION, len); + char * eventName = getEventNameByType(type); + + sprintf(res, template, extractedData, eventName); + + free(extractedData); + free(eventName); return res; } @@ -434,8 +466,13 @@ static char * getSectionEventData(uint8_t type, uint8_t * data, uint8_t len) { char * template = ",\"section\":%s,\"event\":\"%s\",\"scope\":\"Section\""; char * res = malloc(sizeof(char) * (strlen(template) + MAX_EVENT_NAME_LENGTH + 2)); + char * extractedData = getData(data, DEFAULT_DATA_POSITION, len); + char * eventName = getEventNameByType(type); + + sprintf(res, template, extractedData, eventName); - sprintf(res, template, getData(data, DEFAULT_DATA_POSITION, len), getEventNameByType(type)); + free(extractedData); + free(eventName); return res; } @@ -444,9 +481,12 @@ static char * getCommonEventData(uint8_t type, uint8_t * data, uint8_t len, char { char * template = ",\"event\":\"%s\",\"scope\":\"%s\""; char * res; - + char * eventName = getEventNameByType(type); + res = malloc(sizeof(char) * (strlen(template) + MAX_EVENT_NAME_LENGTH + 1 + strlen(scope))); - sprintf(res, template, getEventNameByType(type), scope); + sprintf(res, template, eventName, scope); + + free(eventName); return res; } From 94bbbb7035cda33cc21c0572f4a807783776cfaa Mon Sep 17 00:00:00 2001 From: Denis Morozov Date: Mon, 30 Dec 2024 01:07:45 +0500 Subject: [PATCH 3/8] Small improvements --- libdozor/device-event.c | 2 +- libdozor/event.c | 47 ++++++++++++----------------------------- 2 files changed, 14 insertions(+), 35 deletions(-) diff --git a/libdozor/device-event.c b/libdozor/device-event.c index 4c7a402..2b0bcff 100644 --- a/libdozor/device-event.c +++ b/libdozor/device-event.c @@ -83,7 +83,7 @@ unsigned short int getDeviceEvents(const uint8_t * raw, long int bufSize, Device return eventCount; } -void getDeviceEvent(DeviceEvent * deviceEvent, const uint8_t * raw, unsigned short int eventSize) +static void getDeviceEvent(DeviceEvent * deviceEvent, const uint8_t * raw, unsigned short int eventSize) { unsigned short int eventDataSize = 0; diff --git a/libdozor/event.c b/libdozor/event.c index 6aa3c96..2d43a22 100644 --- a/libdozor/event.c +++ b/libdozor/event.c @@ -365,15 +365,13 @@ static char * getFirmwareVersionEventData(uint8_t type, uint8_t * data, uint8_t char * subVersion = getData(data, DEFAULT_DATA_POSITION, len); char * subVersionData = getData(data, VERSION_DATA_POSITION, len); long int version = strtol(subVersionData, 0, 10) & VERSION_MASK; - char * eventName = getEventNameByType(type); res = malloc(sizeof(char) * (strlen(template) + MAX_EVENT_NAME_LENGTH + 4)); - sprintf(res, template, eventName, version, subVersion); + sprintf(res, template, getEventNameByType(type), version, subVersion); free(subVersion); free(subVersionData); - free(eventName); - + return res; } @@ -390,14 +388,11 @@ static char * getCommandEventData(uint8_t type, uint8_t * data, uint8_t len) char * cmdId = getData(data, DEFAULT_DATA_POSITION, len); logger(LOG_LEVEL_DEBUG, "event.c(getCommandEventData)", "command id %s, position - %d, length - %d", cmdId, DEFAULT_DATA_POSITION, len); - char * eventName = getEventNameByType(type); - res = malloc(sizeof(char) * (strlen(template) + MAX_EVENT_NAME_LENGTH + MAX_COMMAND_RESULT_NAME_LENGTH + 4)); - sprintf(res, template, eventName, cmdId, cmdResult, cmdResultName); + sprintf(res, template, getEventNameByType(type), cmdId, cmdResult, cmdResultName); free(cmdResult); free(cmdId); - free(eventName); return res; } @@ -407,13 +402,11 @@ static char * getReportEventData(uint8_t type, uint8_t * data, uint8_t len) char * template = ",\"temp\":%s,\"event\":\"%s\",\"scope\":\"Common\""; char * res = malloc(sizeof(char) * (strlen(template) + MAX_EVENT_NAME_LENGTH + 2)); char * extractedData = getData(data, REPORT_TEMP_DATA_POSITION, len); - char * eventName = getEventNameByType(type); - - sprintf(res, template, extractedData, eventName); + + sprintf(res, template, extractedData, getEventNameByType(type)); free(extractedData); - free(eventName); - + return res; } @@ -422,12 +415,10 @@ static char * getAuthEventData(uint8_t type, uint8_t * data, uint8_t len) char * template = ",\"user\":%s,\"event\":\"%s\",\"scope\":\"Auth\""; char * res = malloc(sizeof(char) * (strlen(template) + MAX_EVENT_NAME_LENGTH + 2)); char * extractedData = getData(data, DEFAULT_DATA_POSITION, len); - char * eventName = getEventNameByType(type); - sprintf(res, template, extractedData, eventName); + sprintf(res, template, extractedData, getEventNameByType(type)); free(extractedData); - free(eventName); return res; } @@ -437,13 +428,10 @@ static char * getSecurityEventData(uint8_t type, uint8_t * data, uint8_t len) char * template = ",\"user\":%s,\"event\":\"%s\",\"scope\":\"Security\""; char * res = malloc(sizeof(char) * (strlen(template) + MAX_EVENT_NAME_LENGTH + 2)); char * extractedData = getData(data, USER_DATA_POSITION, len); - char * eventName = getEventNameByType(type); - sprintf(res, template, extractedData, eventName); + sprintf(res, template, extractedData, getEventNameByType(type)); free(extractedData); - free(eventName); - return res; } @@ -452,13 +440,9 @@ static char * getZoneEventData(uint8_t type, uint8_t * data, uint8_t len) char * template = ",\"zone\":%s,\"event\":\"%s\",\"scope\":\"Zone\""; char * res = malloc(sizeof(char) * (strlen(template) + MAX_EVENT_NAME_LENGTH + 2)); char * extractedData = getData(data, DEFAULT_DATA_POSITION, len); - char * eventName = getEventNameByType(type); - - sprintf(res, template, extractedData, eventName); + sprintf(res, template, extractedData, getEventNameByType(type)); free(extractedData); - free(eventName); - return res; } @@ -467,12 +451,10 @@ static char * getSectionEventData(uint8_t type, uint8_t * data, uint8_t len) char * template = ",\"section\":%s,\"event\":\"%s\",\"scope\":\"Section\""; char * res = malloc(sizeof(char) * (strlen(template) + MAX_EVENT_NAME_LENGTH + 2)); char * extractedData = getData(data, DEFAULT_DATA_POSITION, len); - char * eventName = getEventNameByType(type); - - sprintf(res, template, extractedData, eventName); + + sprintf(res, template, extractedData, getEventNameByType(type)); free(extractedData); - free(eventName); return res; } @@ -481,12 +463,9 @@ static char * getCommonEventData(uint8_t type, uint8_t * data, uint8_t len, char { char * template = ",\"event\":\"%s\",\"scope\":\"%s\""; char * res; - char * eventName = getEventNameByType(type); - + res = malloc(sizeof(char) * (strlen(template) + MAX_EVENT_NAME_LENGTH + 1 + strlen(scope))); - sprintf(res, template, eventName, scope); - - free(eventName); + sprintf(res, template, getEventNameByType(type), scope); return res; } From 9dc7bfd6a201166cb606a9a1abf7158d94003acb Mon Sep 17 00:00:00 2001 From: Denis Morozov Date: Mon, 30 Dec 2024 04:32:45 +0500 Subject: [PATCH 4/8] Make logger input static --- liblogger/liblogger.c | 2 +- liblogger/liblogger.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/liblogger/liblogger.c b/liblogger/liblogger.c index f2142df..41da56e 100644 --- a/liblogger/liblogger.c +++ b/liblogger/liblogger.c @@ -38,7 +38,7 @@ void logger(LogLevel level, const char* module, const char* format, ...) { printf("[%s] %s: %s\n", logLevel2Str(level), module, logMessage); } -void blobToHexStr(char *res, uint8_t *data, int data_length) { +void blobToHexStr(char *res, const uint8_t *data, const int data_length) { int offset = 0; for (int i = 0; i < data_length; i++) { offset += snprintf(res + offset, 3, "%02x", data[i]); diff --git a/liblogger/liblogger.h b/liblogger/liblogger.h index 4af5277..ef5ad68 100644 --- a/liblogger/liblogger.h +++ b/liblogger/liblogger.h @@ -17,5 +17,5 @@ void set_log_level(LogLevel level); LogLevel get_log_level(); char * logLevel2Str(LogLevel level); void logger(LogLevel level, const char* module, const char* format, ...); -void blobToHexStr(char *res, uint8_t *data, int data_length); +void blobToHexStr(char *res, const uint8_t *data, const int data_length); #endif // LIBLOGGER_H From 3a16c692727fc2590c16af097a978c0970895456 Mon Sep 17 00:00:00 2001 From: Denis Morozov Date: Mon, 30 Dec 2024 04:33:06 +0500 Subject: [PATCH 5/8] Make getDateTime thread safe --- libdozor/utils.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/libdozor/utils.c b/libdozor/utils.c index 026cac4..2b0306f 100644 --- a/libdozor/utils.c +++ b/libdozor/utils.c @@ -29,10 +29,12 @@ void char2utf8(wchar_t* dest, const unsigned char* src) mbstowcs(dest, src, new_length); } -char * getDateTime(const uint32_t t) -{ - time_t ot; - struct tm * date; - ot = t + DATE_TIME_OFFSET; - return ctime(&ot); +char * getDateTime(const uint32_t t) { + time_t ot = t + DATE_TIME_OFFSET; + struct tm *date = localtime(&ot); + char *buffer = malloc(26); // Enough space for the formatted string + if (buffer != NULL) { + strftime(buffer, 26, "%a %b %d %H:%M:%S %Y", date); + } + return buffer; } From 616d16c42b996c2b4ddc438475c53bd4332ce369 Mon Sep 17 00:00:00 2001 From: Denis Morozov Date: Mon, 30 Dec 2024 04:36:22 +0500 Subject: [PATCH 6/8] Fix event date timestamp issue --- libdozor/device-event.c | 54 +++++++++++++++++++++++++++-------------- libdozor/device-event.h | 2 +- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/libdozor/device-event.c b/libdozor/device-event.c index 2b0bcff..5f8a380 100644 --- a/libdozor/device-event.c +++ b/libdozor/device-event.c @@ -23,22 +23,45 @@ #include "liblogger.h" #include "device-event.h" -const unsigned char MSGDATASIZE[68] = { +static const unsigned char MSGDATASIZE[68] = { + // 0 - 4 0, 2, 2, 1, 1, + // 5 - 9 1, 1, 1, 1, 1, + // 10 - 14 1, 1, 1, 1, 1, + // 15 - 19 1, 1, 4, 0, 0, + // 20 - 24 0, 1, 1, 0, 0, + // 25 - 29 0, 1, 1, 1, 1, + // 30 - 34 1, 1, 1, 0, 2, + // 35 - 39 2, 4, 4, 0, 16, + // 40 - 44 1, 0, 17, 1, 1, + // 45 - 49 1, 1, 1, 1, 1, + // 50 - 54 1, 1, 1, 1, 1, + // 55 - 59 1, 1, 4, 4, 1, + // 60 - 64 1, 1, 1, 5, 3, + // 65 - 68 37, 4, 73 }; +static void getDeviceEvent(DeviceEvent * deviceEvent, const uint8_t * raw, unsigned short int eventDataSize) +{ + deviceEvent->type = raw[0]; + deviceEvent->dataLength = eventDataSize; + + memcpy(&deviceEvent->time, &raw[1], sizeof(deviceEvent->time)); + memcpy(&deviceEvent->data, &raw[MESSAGE_ALIGN_SIZE], (size_t) eventDataSize); +} + unsigned short int getDeviceEvents(const uint8_t * raw, long int bufSize, DeviceEvent events[]) { long int totalLength = bufSize; @@ -52,7 +75,7 @@ unsigned short int getDeviceEvents(const uint8_t * raw, long int bufSize, Device if (deviceEvent == NULL) { fprintf(stderr, "***device-event.c: Unable to allocate memory for device event: %s\n", strerror(errno)); - return 64; + return 0; } memset(deviceEvent, 0, sizeof(DeviceEvent)); @@ -69,10 +92,18 @@ unsigned short int getDeviceEvents(const uint8_t * raw, long int bufSize, Device { eventSize = MSGDATASIZE[raw[index]] + MESSAGE_ALIGN_SIZE; - getDeviceEvent(deviceEvent, &raw[index], eventSize); - memcpy(&events[eventCount], deviceEvent, sizeof(DeviceEvent)); + char *hexStr = (char *)malloc(eventSize * 2 + 1); + if (hexStr) { + + blobToHexStr(hexStr, &raw[index], eventSize); + + logger(LOG_LEVEL_INFO, "device-event(getDeviceEvents)", "event id 0x%x: %s", raw[index], hexStr); - logger(LOG_LEVEL_DEBUG, "device-event(getDeviceEvents)", "event id 0x%x at position %d, size - %d\n", raw[index], index, eventSize); + free(hexStr); + } + + getDeviceEvent(deviceEvent, &raw[index], MSGDATASIZE[raw[index]]); + memcpy(&events[eventCount], deviceEvent, sizeof(DeviceEvent)); eventCount += 1; index = index + eventSize; @@ -82,16 +113,3 @@ unsigned short int getDeviceEvents(const uint8_t * raw, long int bufSize, Device free(deviceEvent); return eventCount; } - -static void getDeviceEvent(DeviceEvent * deviceEvent, const uint8_t * raw, unsigned short int eventSize) -{ - unsigned short int eventDataSize = 0; - - eventDataSize = eventSize - sizeof(deviceEvent->time); - - deviceEvent->type = raw[0]; - deviceEvent->dataLength = eventDataSize; - - memcpy(&deviceEvent->time, &raw[5 + eventSize - sizeof(deviceEvent->time)], sizeof(deviceEvent->time)); - memcpy(&deviceEvent->data, &raw[5], (size_t) eventDataSize); -} \ No newline at end of file diff --git a/libdozor/device-event.h b/libdozor/device-event.h index f1720d9..c4bbad1 100644 --- a/libdozor/device-event.h +++ b/libdozor/device-event.h @@ -22,6 +22,7 @@ #define MAX_DEVICE_EVENT_DATA_SIZE 80 #define MAX_EVENTS_PER_DEVICE 256 +// 4 bytes for date, 1 byte for event type id #define MESSAGE_ALIGN_SIZE 5 typedef struct EVENT { @@ -32,6 +33,5 @@ typedef struct EVENT { } DeviceEvent; unsigned short int getDeviceEvents(const uint8_t * raw, long int bufSize, DeviceEvent * events); -void getDeviceEvent(DeviceEvent *, const uint8_t *, unsigned short int eventSize); #endif \ No newline at end of file From 752fb6992595263a4292412fb03dda69996c9b67 Mon Sep 17 00:00:00 2001 From: Denis Morozov Date: Mon, 30 Dec 2024 04:36:52 +0500 Subject: [PATCH 7/8] Fix event handling memory leaks --- libdozor/event.c | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/libdozor/event.c b/libdozor/event.c index 2d43a22..28e6aff 100644 --- a/libdozor/event.c +++ b/libdozor/event.c @@ -209,7 +209,7 @@ void convertDeviceEventToCommon(EventInfo* eventInfo, uint8_t site, DeviceEvent* eventInfo->eventType = ENUM_EVENT_TYPE_COMMONEVENT; const char * template = "{\"site\":%d,\"typeId\":%d,\"timestamp\":\"%s\",\"data\":\""; - char * timestamp = malloc(sizeof(char) * 25); + char * timestamp = ""; char * res = malloc(sizeof(char) * 1024); unsigned short int index; char * temp = malloc(sizeof(char) * 3); @@ -217,9 +217,11 @@ void convertDeviceEventToCommon(EventInfo* eventInfo, uint8_t site, DeviceEvent* uint8_t * ptr = (uint8_t*) deviceEvent->data; char * parsedEvent; + char * parsedSubEvent; - memcpy(timestamp, getDateTime(deviceEvent->time), sizeof(char) * 25); - timestamp[24] = 0x0; + if (deviceEvent->time != 0x00000000) { + timestamp = getDateTime(deviceEvent->time); + } sprintf(res, template, site, deviceEvent->type, timestamp); @@ -241,12 +243,14 @@ void convertDeviceEventToCommon(EventInfo* eventInfo, uint8_t site, DeviceEvent* case 0xd: case 0xf: logger(LOG_LEVEL_DEBUG, "event.c", "handle zone event"); - parsedEvent = getZoneEventData(deviceEvent->type, deviceEvent->data, deviceEvent->dataLength); - - strcat(res, parsedEvent); - sprintf(eventInfo->sourceId, "%s", getData(deviceEvent->data, DEFAULT_DATA_POSITION, deviceEvent->dataLength)); + parsedSubEvent = getZoneEventData(deviceEvent->type, deviceEvent->data, deviceEvent->dataLength); + parsedEvent = getData(deviceEvent->data, DEFAULT_DATA_POSITION, deviceEvent->dataLength); + + strcat(res, parsedSubEvent); + sprintf(eventInfo->sourceId, "%s", parsedEvent); eventInfo->eventType = ENUM_EVENT_TYPE_ZONEINFO; + free(parsedSubEvent); free(parsedEvent); break; @@ -259,12 +263,14 @@ void convertDeviceEventToCommon(EventInfo* eventInfo, uint8_t site, DeviceEvent* case 0x35: case 0x37: logger(LOG_LEVEL_DEBUG, "event.c", "handling section event\n"); - parsedEvent = getSectionEventData(deviceEvent->type, deviceEvent->data, deviceEvent->dataLength); + parsedSubEvent = getSectionEventData(deviceEvent->type, deviceEvent->data, deviceEvent->dataLength); + parsedEvent = getData(deviceEvent->data, DEFAULT_DATA_POSITION, deviceEvent->dataLength); - strcat(res, parsedEvent); - sprintf(eventInfo->sourceId, "%s", getData(deviceEvent->data, DEFAULT_DATA_POSITION, deviceEvent->dataLength)); + strcat(res, parsedSubEvent); + sprintf(eventInfo->sourceId, "%s", parsedEvent); eventInfo->eventType = ENUM_EVENT_TYPE_SECTIONINFO; + free(parsedSubEvent); free(parsedEvent); break; @@ -272,10 +278,13 @@ void convertDeviceEventToCommon(EventInfo* eventInfo, uint8_t site, DeviceEvent* // AuthenticationEvent case 0x1b: logger(LOG_LEVEL_DEBUG, "event.c", "handling authentication event"); - parsedEvent = getAuthEventData(deviceEvent->type, deviceEvent->data, deviceEvent->dataLength); - strcat(res, parsedEvent); - sprintf(eventInfo->sourceId, "%s", getData(deviceEvent->data, DEFAULT_DATA_POSITION, deviceEvent->dataLength)); + parsedSubEvent = getAuthEventData(deviceEvent->type, deviceEvent->data, deviceEvent->dataLength); + parsedEvent = getData(deviceEvent->data, DEFAULT_DATA_POSITION, deviceEvent->dataLength); + strcat(res, parsedSubEvent); + sprintf(eventInfo->sourceId, "%s", parsedEvent); + + free(parsedSubEvent); free(parsedEvent); break; @@ -284,13 +293,16 @@ void convertDeviceEventToCommon(EventInfo* eventInfo, uint8_t site, DeviceEvent* case 0x39: case 0x3a: logger(LOG_LEVEL_DEBUG, "event.c", "handling arm/disarm event"); - parsedEvent = getSecurityEventData(deviceEvent->type, deviceEvent->data, deviceEvent->dataLength); - strcat(res, parsedEvent); - sprintf(eventInfo->sourceId, "%s", getData(deviceEvent->data, USER_DATA_POSITION, deviceEvent->dataLength)); + parsedSubEvent = getSecurityEventData(deviceEvent->type, deviceEvent->data, deviceEvent->dataLength); + parsedEvent = getData(deviceEvent->data, USER_DATA_POSITION, deviceEvent->dataLength); + + strcat(res, parsedSubEvent); + sprintf(eventInfo->sourceId, "%s", parsedEvent); eventInfo->eventType = ENUM_EVENT_TYPE_ARM_DISARM; + free(parsedSubEvent); free(parsedEvent); - + break; // SecurityEvent From 4698fcfcd039622e61c4bfe345351d0696b5ca5f Mon Sep 17 00:00:00 2001 From: Denis Morozov Date: Mon, 30 Dec 2024 04:38:04 +0500 Subject: [PATCH 8/8] Extract to DEBUG mode logging --- libdozor/device-event.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libdozor/device-event.c b/libdozor/device-event.c index 5f8a380..e67457c 100644 --- a/libdozor/device-event.c +++ b/libdozor/device-event.c @@ -97,7 +97,7 @@ unsigned short int getDeviceEvents(const uint8_t * raw, long int bufSize, Device blobToHexStr(hexStr, &raw[index], eventSize); - logger(LOG_LEVEL_INFO, "device-event(getDeviceEvents)", "event id 0x%x: %s", raw[index], hexStr); + logger(LOG_LEVEL_DEBUG, "device-event(getDeviceEvents)", "event id 0x%x: %s", raw[index], hexStr); free(hexStr); }