Ack Thanks Lennart
-----Original Message----- From: Vu Minh Nguyen [mailto:[email protected]] Sent: den 16 september 2015 06:01 To: [email protected]; Lennart Lund; Giang Do T Cc: [email protected] Subject: [PATCH 1 of 1] logsv: fix logsv gets stuck in a loop if passing zero(0) to maxFilesRotated [#1399] osaf/libs/agents/saf/lga/lga_api.c | 10 ++- osaf/services/saf/logsv/lgs/lgs_evt.c | 9 ++ tests/logsv/tet_LogOiOps.c | 23 +++++++ tests/logsv/tet_saLogStreamOpen_2.c | 103 ++++++++++++++++++++++++++++++++++ 4 files changed, 144 insertions(+), 1 deletions(-) Log agent and logsv do not validate this input when openning stream using LOG API. Fix this defect by adding validation in the log agent as well as logsv. diff --git a/osaf/libs/agents/saf/lga/lga_api.c b/osaf/libs/agents/saf/lga/lga_api.c --- a/osaf/libs/agents/saf/lga/lga_api.c +++ b/osaf/libs/agents/saf/lga/lga_api.c @@ -536,7 +536,15 @@ static SaAisErrorT validate_open_params( if(logFileCreateAttributes->maxLogRecordSize > logFileCreateAttributes->maxLogFileSize){ TRACE("maxLogRecordSize is greater than the maxLogFileSize"); return SA_AIS_ERR_INVALID_PARAM; - } + } + + /* Validate maxFilesRotated just in case of SA_LOG_FILE_FULL_ACTION_ROTATE type */ + if ((logFileCreateAttributes->logFileFullAction == SA_LOG_FILE_FULL_ACTION_ROTATE) && + ((logFileCreateAttributes->maxFilesRotated < 1) || + (logFileCreateAttributes->maxFilesRotated > 127))) { + TRACE("Invalid maxFilesRotated. Valid range = [1-127]"); + return SA_AIS_ERR_INVALID_PARAM; + } } *header_type = (uint32_t)SA_LOG_GENERIC_HEADER; diff --git a/osaf/services/saf/logsv/lgs/lgs_evt.c b/osaf/services/saf/logsv/lgs/lgs_evt.c --- a/osaf/services/saf/logsv/lgs/lgs_evt.c +++ b/osaf/services/saf/logsv/lgs/lgs_evt.c @@ -797,6 +797,15 @@ static SaAisErrorT create_new_app_stream goto done; } + /* Validate maxFilesRotated just in case of SA_LOG_FILE_FULL_ACTION_ROTATE type */ + if ((open_sync_param->logFileFullAction == SA_LOG_FILE_FULL_ACTION_ROTATE) && + ((open_sync_param->maxFilesRotated < 1) || + (open_sync_param->maxFilesRotated > 127))) { + TRACE("Invalid maxFilesRotated. Valid Range = [1-127]"); + rc = SA_AIS_ERR_INVALID_PARAM; + goto done; + } + if (open_sync_param->logFileFmt == NULL) { TRACE("logFileFmt is NULL, use default one"); const char* logFileFormat = (char *) lgs_cfg_get(LGS_IMM_LOG_STREAM_FILE_FORMAT); diff --git a/tests/logsv/tet_LogOiOps.c b/tests/logsv/tet_LogOiOps.c --- a/tests/logsv/tet_LogOiOps.c +++ b/tests/logsv/tet_LogOiOps.c @@ -3108,6 +3108,27 @@ done: rc = system(command); } +/** + * Add test case for ticket #1399: + * logsv gets stuck in while loop when setting maxFilesRotated=0 + * + * This test case verifies logsv returns error if + * setting 0 to saLogStreamMaxFilesRotated attribute. + */ +void verMaxFilesRotated(void) +{ + int rc; + char command[256]; + + /* Expect getting exist code = 1 as saLogStreamMaxFilesRotated=0 */ + strcpy(command, "immcfg -c SaLogStreamConfig safLgStrCfg=verMaxFilesRotated,safApp=safLogService " + "-a saLogStreamFileName=str6file -a saLogStreamPathName=. -a saLogStreamMaxFilesRotated=0 " + "2> /dev/null"); + rc = system(command); + rc_validate(WEXITSTATUS(rc), 1); +} + + __attribute__ ((constructor)) static void saOiOperations_constructor(void) { /* Stream objects */ @@ -3220,6 +3241,8 @@ done: test_case_add(6, saLogOi_76, "Create: saLogStreamMaxFilesRotated < 128, Ok"); test_case_add(6, saLogOi_77, "Create: saLogStreamMaxFilesRotated > 128, ERR"); test_case_add(6, saLogOi_78, "Create: saLogStreamMaxFilesRotated == 128, ERR"); + test_case_add(6, verMaxFilesRotated, "Create: saLogStreamMaxFilesRotated = 0, ERR"); + /* Tests for modify */ test_case_add(6, saLogOi_100, "Modify: saLogStreamSeverityFilter < 0x7f, Ok"); test_case_add(6, saLogOi_101, "Modify: saLogStreamSeverityFilter >= 0x7f, ERR"); diff --git a/tests/logsv/tet_saLogStreamOpen_2.c b/tests/logsv/tet_saLogStreamOpen_2.c --- a/tests/logsv/tet_saLogStreamOpen_2.c +++ b/tests/logsv/tet_saLogStreamOpen_2.c @@ -328,6 +328,107 @@ void saLogStreamOpen_2_23(void) test_validate(rc_17, SA_AIS_ERR_INVALID_PARAM); } +/** + * Added test cases to verify ticket #1399: + * logsv gets stuck in while loop if setting maxFilesRotated = 0. + * + * This test case verifies logsv returns error if + * setting 0 to saLogStreamMaxFilesRotated attribute. + */ +void saLogStreamOpen_2_46(void) +{ + SaAisErrorT rc = SA_AIS_OK; + SaNameT logStreamName = {.length = 0 }; + + strcpy((char *)logStreamName.value, SA_LOG_STREAM_APPLICATION1); + logStreamName.length = strlen((char *)logStreamName.value); + + SaLogFileCreateAttributesT_2 appLogFileCreateAttributes; + + /* App stream information */ + appLogFileCreateAttributes.logFilePathName = "appstream"; + appLogFileCreateAttributes.logFileName = "appstream"; + appLogFileCreateAttributes.maxLogFileSize = DEFAULT_APP_LOG_FILE_SIZE; + appLogFileCreateAttributes.maxLogRecordSize = DEFAULT_APP_LOG_REC_SIZE; + appLogFileCreateAttributes.haProperty = SA_TRUE; + appLogFileCreateAttributes.logFileFullAction = SA_LOG_FILE_FULL_ACTION_ROTATE; + appLogFileCreateAttributes.maxFilesRotated = 0; + appLogFileCreateAttributes.logFileFmt = NULL; + + rc = saLogInitialize(&logHandle, &logCallbacks, &logVersion); + if (rc != SA_AIS_OK) { + fprintf(stderr, "Failed at saLogInitialize: %d\n ", (int)rc); + test_validate(rc, SA_AIS_OK); + return; + } + + rc = saLogSelectionObjectGet(logHandle, &selectionObject); + if (rc != SA_AIS_OK) { + fprintf(stderr, "Failed at saLogSelectionObjectGet: %d \n ", (int)rc); + test_validate(rc, SA_AIS_OK); + goto done; + } + + rc = saLogStreamOpen_2(logHandle, &logStreamName, &appLogFileCreateAttributes, + SA_LOG_STREAM_CREATE, SA_TIME_ONE_SECOND, &logStreamHandle); + test_validate(rc, SA_AIS_ERR_INVALID_PARAM); + +done: + rc = saLogFinalize(logHandle); + if (rc != SA_AIS_OK) { + fprintf(stderr, "Failed to call salogFinalize: %d\n", (int) rc); + } +} + +/** + * Verify that setting saLogStreamMaxFilesRotated > 127 is not allowed. + * Valid range is in [1 - 127] + */ +void saLogStreamOpen_2_47(void) +{ + SaAisErrorT rc = SA_AIS_OK; + SaNameT logStreamName = {.length = 0 }; + + strcpy((char *)logStreamName.value, SA_LOG_STREAM_APPLICATION1); + logStreamName.length = strlen((char *)logStreamName.value); + + SaLogFileCreateAttributesT_2 appLogFileCreateAttributes; + + /* App stream information */ + appLogFileCreateAttributes.logFilePathName = "appstream"; + appLogFileCreateAttributes.logFileName = "appstream"; + appLogFileCreateAttributes.maxLogFileSize = DEFAULT_APP_LOG_FILE_SIZE; + appLogFileCreateAttributes.maxLogRecordSize = DEFAULT_APP_LOG_REC_SIZE; + appLogFileCreateAttributes.haProperty = SA_TRUE; + appLogFileCreateAttributes.logFileFullAction = SA_LOG_FILE_FULL_ACTION_ROTATE; + appLogFileCreateAttributes.maxFilesRotated = 128; + appLogFileCreateAttributes.logFileFmt = NULL; + + rc = saLogInitialize(&logHandle, &logCallbacks, &logVersion); + if (rc != SA_AIS_OK) { + fprintf(stderr, "Failed at saLogInitialize: %d\n ", (int)rc); + test_validate(rc, SA_AIS_OK); + return; + } + + rc = saLogSelectionObjectGet(logHandle, &selectionObject); + if (rc != SA_AIS_OK) { + fprintf(stderr, "Failed at saLogSelectionObjectGet: %d \n ", (int)rc); + test_validate(rc, SA_AIS_OK); + goto done; + } + + rc = saLogStreamOpen_2(logHandle, &logStreamName, &appLogFileCreateAttributes, + SA_LOG_STREAM_CREATE, SA_TIME_ONE_SECOND, &logStreamHandle); + test_validate(rc, SA_AIS_ERR_INVALID_PARAM); + +done: + rc = saLogFinalize(logHandle); + if (rc != SA_AIS_OK) { + fprintf(stderr, "Failed to call salogFinalize: %d\n", (int) rc); + } +} + extern void saLogStreamOpenAsync_2_01(void); extern void saLogStreamOpenCallbackT_01(void); extern void saLogWriteLog_01(void); @@ -402,5 +503,7 @@ extern void saLogStreamClose_01(void); test_case_add(2, saLogWriteLogCallbackT_02, "saLogWriteLogCallbackT() SA_DISPATCH_ALL"); test_case_add(2, saLogFilterSetCallbackT_01, "saLogFilterSetCallbackT OK"); test_case_add(2, saLogStreamClose_01, "saLogStreamClose OK"); + test_case_add(2, saLogStreamOpen_2_46, "saLogStreamOpen_2 with maxFilesRotated = 0, ERR"); + test_case_add(2, saLogStreamOpen_2_47, "saLogStreamOpen_2 with maxFilesRotated = 128, ERR"); } ------------------------------------------------------------------------------ Monitor Your Dynamic Infrastructure at Any Scale With Datadog! Get real-time metrics from all of your servers, apps and tools in one place. SourceForge users - Click here to start your Free Trial of Datadog now! http://pubads.g.doubleclick.net/gampad/clk?id=241902991&iu=/4140 _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
