osaf/libs/agents/saf/lga/lga_api.c         |   2 +-
 osaf/libs/common/logsv/include/lgsv_defs.h |  10 +++++
 osaf/services/saf/logsv/lgs/lgs_imm.c      |  22 +++++++++++-
 tests/logsv/tet_LogOiOps.c                 |  47 +++++++++++++++++++++++++-
 tests/logsv/tet_saLogStreamOpen_2.c        |  54 ++++++++++++++++++++++++++++++
 5 files changed, 131 insertions(+), 4 deletions(-)


Correct the verification rule for the filename length.

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
@@ -561,7 +561,7 @@ static SaAisErrorT validate_open_params(
        /* Check implementation specific string length */
        if (NULL != logFileCreateAttributes) {
                len = strlen(logFileCreateAttributes->logFileName);
-               if ((len == 0) || (len > NAME_MAX)) {
+               if ((len == 0) || (len > LOG_NAME_MAX)) {
                        TRACE("logFileName");
                        return SA_AIS_ERR_INVALID_PARAM;
                }
diff --git a/osaf/libs/common/logsv/include/lgsv_defs.h 
b/osaf/libs/common/logsv/include/lgsv_defs.h
--- a/osaf/libs/common/logsv/include/lgsv_defs.h
+++ b/osaf/libs/common/logsv/include/lgsv_defs.h
@@ -25,4 +25,14 @@
 // Waiting time in library for sync send, unit 10ms
 #define LGS_WAIT_TIME 1000
 
+// The length of '_yyyymmdd_hhmmss_yyyymmdd_hhmmss.log' including 
null-termination char
+#define LOG_TAIL_MAX 37
+
+/** The log file name format: <filename>_<createtime>_<closetime>.log
+ * '_<createtime>_<closetime>.log' part is appended by logsv and has above 
format,
+ * and '<filename>' part can set by user. Therefore, limit the length of 
<filename> from user,
+ * to make sure the log file name does not exceed the maximum length 
(NAME_MAX).
+ */
+#define LOG_NAME_MAX (NAME_MAX - LOG_TAIL_MAX)
+
 #endif   /* LGSV_DEFS_H */
diff --git a/osaf/services/saf/logsv/lgs/lgs_imm.c 
b/osaf/services/saf/logsv/lgs/lgs_imm.c
--- a/osaf/services/saf/logsv/lgs/lgs_imm.c
+++ b/osaf/services/saf/logsv/lgs/lgs_imm.c
@@ -1429,7 +1429,16 @@ static SaAisErrorT check_attr_validity(S
                                TRACE("NULL pointer to saLogStreamPathName");
                                goto done;
                        }
-                       
+
+                       if (strlen(i_pathName) > PATH_MAX) {
+                               /* Path name is too long */
+                               rc = SA_AIS_ERR_BAD_OPERATION;
+                               report_oi_error(immOiHandle, opdata->ccbId,
+                                               "saLogStreamPathName is so 
long");
+                               TRACE("saLogStreamPathName is so long (max: 
%d)", PATH_MAX);
+                               goto done;
+                       }
+
                        if (lgs_relative_path_check_ts(i_pathName) == true) {
                                report_oi_error(immOiHandle, opdata->ccbId,
                                                        "Path %s not valid", 
i_pathName);
@@ -1453,7 +1462,16 @@ static SaAisErrorT check_attr_validity(S
                                TRACE("NULL pointer to saLogStreamFileName");
                                goto done;
                        }
-                       
+
+                       if (strlen(i_fileName) > LOG_NAME_MAX) {
+                               /* File name is too long */
+                               rc = SA_AIS_ERR_BAD_OPERATION;
+                               report_oi_error(immOiHandle, opdata->ccbId,
+                                               "saLogStreamFileName is so 
long");
+                               TRACE("saLogStreamFileName is so long (max: 
%d)", LOG_NAME_MAX);
+                               goto done;
+                       }
+
                        if (chk_filepath_stream_exist(i_fileName, i_pathName,
                                        stream, opdata->operationType)) {
                                report_oi_error(immOiHandle, opdata->ccbId,
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
@@ -3318,6 +3318,50 @@ void verFixLogRec_Min(void)
     rc_validate(WEXITSTATUS(rc), 1);
 }
 
+
+/**
+ * Test cases to verify #1493
+ */
+
+/* Verify that it is not allowed to pass a string value to
+ * saLogStreamFileName which its length is larger than 218.
+ */
+void verFilenameLength_01(void)
+{
+    int rc;
+    char command[500];
+       char fileName[220];
+
+       /* Create a string with 218 characters */
+       memset(fileName, 'A', 218);
+       fileName[219] = '\0';
+
+       /* Create an configurable obj class with invalid filename length */
+    sprintf(command, "immcfg -c SaLogStreamConfig safLgStrCfg=TestLength "
+                  "-a saLogStreamFileName=\"%s\" -a saLogStreamPathName=. "
+                  "2> /dev/null", fileName);
+    rc = system(command);
+       rc_validate(WEXITSTATUS(rc), 1);
+}
+
+/* Modify an existing value */
+void verFilenameLength_02(void)
+{
+    int rc;
+    char command[500];
+       char fileName[220];
+
+       /* Create a string with 218 characters */
+       memset(fileName, 'A', 218);
+       fileName[219] = '\0';
+
+       /* Create an configurable obj class with invalid filename length */
+    sprintf(command, "immcfg -a saLogStreamFileName=. -a 
saLogStreamPathName=\"%s\" %s "
+                  "2> /dev/null", fileName, SA_LOG_STREAM_ALARM);
+    rc = system(command);
+       rc_validate(WEXITSTATUS(rc), 1);
+}
+
 __attribute__ ((constructor)) static void saOiOperations_constructor(void)
 {
        /* Stream objects */
@@ -3419,7 +3463,6 @@ void verFixLogRec_Min(void)
        test_case_add(5, verCCBWithValidValues, "CCB Object Modify many 
attributes with valid values, OK");
        test_case_add(5, verCCBWithInvalidValues, "CCB Object Modify many 
attributes with one invalid values, ERR");
 
-
        /* Stream configuration object */
        /* Tests for create */
        test_suite_add(6, "LOG OI tests, Stream configuration object attribute 
validation");
@@ -3437,6 +3480,7 @@ void verFixLogRec_Min(void)
        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, verFilenameLength_01, "Create: saLogStreamFileName > 
218 characters, ERR");
        test_case_add(6, verMaxFilesRotated, "Create: 
saLogStreamMaxFilesRotated = 0, ERR");
        test_case_add(6, verAdminOpOnConfClass, "Perform admin op on 
configurable obj class, ERR");
 
@@ -3461,6 +3505,7 @@ void verFixLogRec_Min(void)
        test_case_add(6, saLogOi_113, "Modify: saLogStreamMaxFilesRotated < 
128, Ok");
        test_case_add(6, saLogOi_114, "Modify: saLogStreamMaxFilesRotated > 
128, ERR");
        test_case_add(6, saLogOi_115, "Modify: saLogStreamMaxFilesRotated == 
128, ERR");
+       test_case_add(6, verFilenameLength_02, "Modify: saLogStreamFileName > 
218 characters, ERR");
 
        /* Add test cases to test #1288 */
        test_case_add(6, verMaxLogRecord_01, "Modify: 
saLogStreamFixedLogRecordSize == 0, write a record = 65535 bytes, OK");
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
@@ -531,6 +531,58 @@ done:
     }
 }
 
+/**
+ * Verify that logFileName length > 218 characters is not allowed.
+ */
+void saLogStreamOpen_2_48(void)
+{
+    SaAisErrorT rc = SA_AIS_OK;
+    SaNameT logStreamName = {.length = 0 };
+    char fileName[220];
+
+    memset(fileName, 'A', 218);
+    fileName[219] = '\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 = fileName;
+    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);
@@ -607,6 +659,8 @@ extern void saLogStreamClose_01(void);
     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");
+    test_case_add(2, saLogStreamOpen_2_48, "saLogStreamOpen_2 with logFileName 
> 218 characters, ERR");
+
     test_case_add(2, verFixLogRec_Max_Err, "saLogStreamOpen_2 with 
maxLogRecordSize > MAX_RECSIZE, ERR");
     test_case_add(2, verFixLogRec_Min_Err, "saLogStreamOpen_2 with 
maxLogRecordSize < 150, ERR");
 }

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to