From 3344d1a728d37f0fb3e82a6a945eee0c780eb734 Mon Sep 17 00:00:00 2001 From: Chernov Dmitriy <cd_work@mail.ru> Date: 周三, 02 3月 2016 21:29:32 +0800 Subject: [PATCH] Fix potential memory leak. #73 --- libscpi/src/parser.c | 61 +++++++++++++++--------------- 1 files changed, 30 insertions(+), 31 deletions(-) diff --git a/libscpi/src/parser.c b/libscpi/src/parser.c index ca0aa93..00cba78 100644 --- a/libscpi/src/parser.c +++ b/libscpi/src/parser.c @@ -219,10 +219,11 @@ result &= processCommand(context); cmd_prev = state->programHeader; } else { - //SCPI_ErrorPush(context, SCPI_ERROR_UNDEFINED_HEADER); /* test */ - data[r-1]=0; + /* place undefined header with error */ + data[r?(r-1):r]=0; SCPI_ErrorPushEx(context, SCPI_ERROR_UNDEFINED_HEADER, data); + //SCPI_ErrorPush(context, SCPI_ERROR_UNDEFINED_HEADER); result = FALSE; } } @@ -269,8 +270,10 @@ context->buffer.length = input_buffer_length; context->buffer.position = 0; context->error_info_heap.data = error_info_heap; - context->error_info_heap.position = 0; - context->error_info_heap.length = error_info_heap_length; + context->error_info_heap.wr = 0; + context->error_info_heap.size = error_info_heap_length; + context->error_info_heap.count = context->error_info_heap.size; + memset(context->error_info_heap.data,0,context->error_info_heap.size); SCPI_ErrorInit(context, error_queue_data, error_queue_size); } @@ -507,44 +510,44 @@ return result; } -#if USE_DEVICE_DEPENDENT_ERROR_INFORMATION - #if USE_MEMORY_ALLOCATION_FREE - #define MAX_BUFF_SIZE 2 - #else - #define MAX_BUFF_SIZE 3 - #endif -#else - #define MAX_BUFF_SIZE 1 -#endif -static size_t startoutputlimit = 0; - +/** + * SCPI-99:21.8 Device-dependent error information. + * Write error information with the following syntax: + * <Error/event_number>,"<Error/event_description>[;<Device-dependent_info>]" + * The maximum string length of <Error/event_description> plus <Device-dependent_info> + * is SCPI_STD_ERROR_DESC_MAX_STRING_LENGTH (255) characters. + * + * @param context + * @param error + * @return + */ size_t SCPI_ResultError(scpi_t * context, scpi_error_t * error) { size_t result = 0; - size_t outputlimit = startoutputlimit++; + size_t outputlimit = SCPI_STD_ERROR_DESC_MAX_STRING_LENGTH; size_t step = 0; const char * quote; - char * data[MAX_BUFF_SIZE]; - size_t len[MAX_BUFF_SIZE]; + char * data[SCPIDEFINE_DESCRIPTION_MAX_PARTS]; + size_t len[SCPIDEFINE_DESCRIPTION_MAX_PARTS]; data[0] = SCPI_ErrorTranslate(error->error_code); len[0] = strlen(data[0]); + #if USE_DEVICE_DEPENDENT_ERROR_INFORMATION - #if USE_MEMORY_ALLOCATION_FREE - data[1] = error->device_dependent_info; - len[1] = error->device_dependent_info ? strlen(data[1]) : 0; - #else - data[1] = SCPIDEFINE_get_1st_part(error->device_dependent_info,&len[1]); - data[2] = SCPIDEFINE_get_1st_part(data[1],&len[2]); - #endif + data[1] = error->device_dependent_info; +#if USE_MEMORY_ALLOCATION_FREE + len[1] = error->device_dependent_info ? strlen(data[1]) : 0; +#else + SCPIDEFINE_get_parts(&context->error_info_heap, data[1], &len[1], &data[2], &len[2]); +#endif #endif result += SCPI_ResultInt32(context, error->error_code); result += writeDelimiter(context); result += writeData(context, "\"", 1); - for(size_t i = 0; data[i] && outputlimit && (i < MAX_BUFF_SIZE); i++){ + for(size_t i = 0; data[i] && outputlimit && (i < SCPIDEFINE_DESCRIPTION_MAX_PARTS); i++){ if(i==1){ result += writeSemicolon(context); outputlimit -= 1; @@ -575,15 +578,11 @@ result += writeData(context, "\"", 1); #if USE_DEVICE_DEPENDENT_ERROR_INFORMATION - #if USE_MEMORY_ALLOCATION_FREE - SCPIDEFINE_free(error->device_dependent_info); - #else - #endif + SCPIDEFINE_free(&context->error_info_heap, error->device_dependent_info, false); #endif return result; } -#undef MAX_BUFF_SIZE /** * Write arbitrary block header with length -- Gitblit v1.9.1