Hi Lennart, I am using tab for indentation, tab-width is 8 characters (C Linux coding rule). And with multiline function signatures, each new line aligns with the first parameter. I am using emacs editor with configuration mentioned in the wiki page. (https://sourceforge.net/p/opensaf/wiki/Emacs/)
Regarding checking PATH_MAX, I think we just need to validate the length at the entry points (e.g: creating streams, modifying log root, etc.), to make sure that the length of "/rootpath/streampath/filename+tail" is not over PATH_MAX. If it passes the entry check, we do not need to check in other places. That is the reason why I removed all check against PATH_MAX. How about your opinion on this? For your other comments, please see my responses inline [Vu]. Regards, Vu. >-----Original Message----- >From: Lennart Lund [mailto:lennart.l...@ericsson.com] >Sent: Friday, January 22, 2016 6:44 PM >To: Vu Minh Nguyen; Anders Widell; mathi.naic...@oracle.com >Cc: opensaf-devel@lists.sourceforge.net; Lennart Lund >Subject: RE: [PATCH 1 of 1] log: Use pathconf() instead of NAME_MAX [#279] > >Hi Vu, > >Some comments: > >General: >Indentation is not correct in all places, please check settings in editor >and fix [Vu] Do you mean I should use spaces for indentation (google C++ style)? If not, could you help to show the wrong indented code line? Thanks. > >lgs_config.cc >------------- >***** >read_log_config_environ_var_2() >line 936-> Original logic is changed incorrectly: > > if (lgs_conf.logRootDirectory_cnfflag == LGS_CNF_DEF) { > /* Has not been set when reading config object */ > if ((val_str = getenv("LOGSV_ROOT_DIRECTORY")) != NULL) { > lgs_conf.logRootDirectory = val_str; > >This is wrong: > if (lgs_conf.logRootDirectory.size() > PATH_MAX) { > lgs_conf.logRootDirectory_cnfflag = >LGS_CNF_ENV; > } > > } else { > LOG_WA("No configuration data for logRootDirectory >found"); > } > } > >Change to something like...: > . > . > . > if (lgs_conf.logRootDirectory.size() < PATH_MAX) { > lgs_conf.logRootDirectory_cnfflag = >LGS_CNF_ENV; > } else { > LOG_WA("LOG root dir read from config file is > >PATH_MAX"); > lgs_conf.logRootDirectory = ""; > } > . > . > . > [Vu] Thanks. I will correct it. >Previous logic: > if (lgs_conf.logRootDirectory_cnfflag == LGS_CNF_DEF) { > /* Has not been set when reading config object */ > if ((val_str = getenv("LOGSV_ROOT_DIRECTORY")) != NULL) { > n = snprintf(lgs_conf.logRootDirectory, PATH_MAX, >"%s", val_str); > if (n >= PATH_MAX) { > /* Fail */ > LOG_WA("LOG root dir read from config file is >> PATH_MAX"); > lgs_conf.logRootDirectory[0] = '\0'; > } else { > lgs_conf.logRootDirectory_cnfflag = >LGS_CNF_ENV; > } > } else { > LOG_WA("No configuration data for logRootDirectory >found"); > } > } > >***** >lgs_path_is_writeable_dir_h() >Line 1263-> Check of PATH_MAX removed: >Since this is a global function it's better to keep the validation of the >in-parameter even if PATH_MAX is checked in many places and it is very >unlikely >that this check will fail. Not doing this validation in the corresponding _hdl >function is ok since the _hdl function is always used together with the _h >function. > >lgs_filehdl >----------- >***** >Path strings are handled as string types in _h function but is converted to >C type string when it's given to the corresponding _hdl function and in the _hdl >function it's converted back to string type again e.g. make_log_dir_...(). >Would it be possible to keep string type all the time? I know there may be >some >things to think about in the generic log_file_api() (lgs_file.cc) but I have not >checked what may be problematic. [Vu] In the generic log_file_api(), it allocates raw data by `malloc()` then using raw copy `memcpy`. If using C++ string, structures containing C++ object will be naively copied with memcpy, the C++ string object may not work properly in this case as its methods are not called, I think. > >***** >own_log_files_by_group_hdl >The mutex lock (below) was originally done after lgs_get_data_gid() (uses >getgrnam()) and chown() but you have moved it before these functions are >called. >The mutex must be unlocked when any function related to the file system is >used. >The thread must never "hang" with the mutex locked. > >osaf_mutex_lock_ordie(&lgs_ftcom_mutex); /* LOCK after critical section */ > [Vu] Thanks. I will correct it. >lgs_stream.cc >------------- >***** >fileopen_h() >Line 73-> Check of PATH_MAX removed: >Since this is a global function it's better to keep the validation of the >in-parameter even if PATH_MAX is checked in many places and it is very >unlikely >that this check will fail. Not doing this validation in the corresponding _hdl >function is ok since the _hdl function is always used together with the _h >function. >Note: >As an example; It is ok to remove the validation of the path against PATH_MAX >in >log_file_open() if this check is done in fileopen_h(). > >***** >file_unlink_h(); See fileopen_h() > >***** >get_number_of_log_files_h() >Line 970-> Check of PATH_MAX removed: >There were several checks against PATH_MAX that are removed ok. However a >validation of the complete path should be done here. See comments above. > >lgs_util.cc >---------- >In all _h files that creates/uses a path the path should be checked against >PATH_MAX. The check can be removed from all _hdl functions if this is done in >all _h functions. See also other files where _h functions are implemented. > >Thanks >Lennart > > >> -----Original Message----- >> From: Vu Minh Nguyen [mailto:vu.m.ngu...@dektech.com.au] >> Sent: den 21 januari 2016 10:21 >> To: Anders Widell; Lennart Lund; mathi.naic...@oracle.com >> Cc: opensaf-devel@lists.sourceforge.net >> Subject: [PATCH 1 of 1] log: Use pathconf() instead of NAME_MAX [#279] >> >> osaf/libs/agents/saf/lga/lga_api.c | 58 ++++- >> osaf/libs/common/logsv/include/lgsv_defs.h | 13 - >> osaf/libs/common/logsv/include/lgsv_msg.h | 4 +- >> osaf/services/saf/logsv/lgs/Makefile.am | 14 +- >> osaf/services/saf/logsv/lgs/lgs.h | 12 +- >> osaf/services/saf/logsv/lgs/lgs_config.cc | 84 +++--- >> osaf/services/saf/logsv/lgs/lgs_config.h | 7 +- >> osaf/services/saf/logsv/lgs/lgs_evt.cc | 61 ++-- >> osaf/services/saf/logsv/lgs/lgs_filehdl.cc | 148 ++++--------- >> osaf/services/saf/logsv/lgs/lgs_filehdl.h | 35 +- >> osaf/services/saf/logsv/lgs/lgs_imm.cc | 178 +++++++-------- >> osaf/services/saf/logsv/lgs/lgs_mbcsv.cc | 32 +- >> osaf/services/saf/logsv/lgs/lgs_mbcsv_v2.cc | 5 +- >> osaf/services/saf/logsv/lgs/lgs_mds.cc | 60 ++++- >> osaf/services/saf/logsv/lgs/lgs_stream.cc | 261 ++++++++++------------- >> osaf/services/saf/logsv/lgs/lgs_stream.h | 30 +- >> osaf/services/saf/logsv/lgs/lgs_util.cc | 312 +++++++++++++++------------ >> osaf/services/saf/logsv/lgs/lgs_util.h | 29 +- >> 18 files changed, 674 insertions(+), 669 deletions(-) >> >> >> Also replace static arrays of log file name, path name >> by C++ string. >> >> 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 >> @@ -27,6 +27,13 @@ >> (SA_DISPATCH_BLOCKING == flag) ) >> >> #define LGSV_NANOSEC_TO_LEAPTM 10000000 >> +/** >> + * Temporary maximum log file name length to avoid LOG client sends >> + * log file name too long (big data) to LOG service. >> + * >> + * The real limit check will be done by service side. >> + */ >> +#define LGA_FILE_LENGTH_TEMP_LIMIT 2048 >> >> /* The main controle block */ >> lga_cb_t lga_cb = { >> @@ -58,15 +65,6 @@ static void populate_open_params(lgsv_st >> } else { >> /* Server will assign a def fmt string if needed >> (logFileFmt==NULL) */ >> open_param->logFileFmt = >> logFileCreateAttributes->logFileFmt; >> - >> - strncpy(open_param->logFileName, >> logFileCreateAttributes->logFileName, NAME_MAX); >> - >> - /* A NULL pointer refers to impl defined >> directory */ >> - if (logFileCreateAttributes->logFilePathName == >> NULL) >> - strcpy(open_param- >> >logFilePathName, "."); >> - else >> - strncpy(open_param- >> >logFilePathName, logFileCreateAttributes->logFilePathName, PATH_MAX); >> - >> open_param->maxLogFileSize = >> logFileCreateAttributes->maxLogFileSize; >> open_param->maxLogRecordSize = >> logFileCreateAttributes->maxLogRecordSize; >> open_param->haProperty = >> logFileCreateAttributes->haProperty; >> @@ -74,6 +72,7 @@ static void populate_open_params(lgsv_st >> open_param->maxFilesRotated = >> logFileCreateAttributes->maxFilesRotated; >> open_param->lstr_open_flags = >> logStreamOpenFlags; >> } >> + >> TRACE_LEAVE(); >> } >> >> @@ -561,8 +560,8 @@ static SaAisErrorT validate_open_params( >> /* Check implementation specific string length */ >> if (NULL != logFileCreateAttributes) { >> len = strlen(logFileCreateAttributes- >> >logFileName); >> - if ((len == 0) || (len > LOG_NAME_MAX)) { >> - TRACE("logFileName"); >> + if ((len == 0) || (len > >> LGA_FILE_LENGTH_TEMP_LIMIT)) { >> + TRACE("logFileName is too long >> (max = %d)", LGA_FILE_LENGTH_TEMP_LIMIT); >> return >> SA_AIS_ERR_INVALID_PARAM; >> } >> if (logFileCreateAttributes->logFilePathName != >> NULL) { >> @@ -628,9 +627,41 @@ SaAisErrorT saLogStreamOpen_2(SaLogHandl >> msg.info.api_info.type = LGSV_STREAM_OPEN_REQ; >> open_param = &msg.info.api_info.param.lstr_open_sync; >> >> + /* Make it safe for free */ >> + open_param->logFileName = NULL; >> + open_param->logFilePathName = NULL; >> + >> populate_open_params(open_param, >> logStreamName, >> - hdl_rec, >> (SaLogFileCreateAttributesT_2 *)logFileCreateAttributes, >> logStreamOpenFlags); >> + hdl_rec, >> + (SaLogFileCreateAttributesT_2 >> *)logFileCreateAttributes, >> + logStreamOpenFlags); >> + >> + if (logFileCreateAttributes != NULL) { >> + /* Construct the logFileName */ >> + open_param->logFileName = (char *) >> malloc(strlen(logFileCreateAttributes->logFileName) + 1); >> + if (open_param->logFileName == NULL) { >> + rc = SA_AIS_ERR_NO_MEMORY; >> + goto done_give_hdl; >> + } >> + strcpy(open_param->logFileName, >> logFileCreateAttributes->logFileName); >> + >> + /* Construct the logFilePathName */ >> + /* A NULL pointer refers to impl defined >> directory */ >> + size_t len = (logFileCreateAttributes- >> >logFilePathName == NULL) ? (2) : >> + >> (strlen(logFileCreateAttributes->logFilePathName) + 1); >> + >> + open_param->logFilePathName = (char *) >> malloc(len); >> + if (open_param->logFilePathName == NULL) { >> + rc = SA_AIS_ERR_NO_MEMORY; >> + goto done_give_hdl; >> + } >> + >> + if (logFileCreateAttributes->logFilePathName == >> NULL) >> + strcpy(open_param- >> >logFilePathName, "."); >> + else >> + strcpy(open_param- >> >logFilePathName, logFileCreateAttributes->logFilePathName); >> + } >> >> /* Normalize the timeOut value */ >> timeout = (uint32_t)(timeOut / >> LGSV_NANOSEC_TO_LEAPTM); >> @@ -699,6 +730,9 @@ SaAisErrorT saLogStreamOpen_2(SaLogHandl >> >> done_give_hdl: >> ncshm_give_hdl(logHandle); >> + free(open_param->logFileName); >> + free(open_param->logFilePathName); >> + >> done: >> TRACE_LEAVE(); >> return rc; >> 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,17 +25,4 @@ >> // 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. Limit the length of <filename> from >> user, >> - * to make sure the log file name does not exceed the maximum length >> (NAME_MAX). >> - * >> - * This macro defines the maximum length for <filename> part. >> - */ >> -#define LOG_NAME_MAX (NAME_MAX - LOG_TAIL_MAX) >> - >> #endif /* LGSV_DEFS_H */ >> diff --git a/osaf/libs/common/logsv/include/lgsv_msg.h >> b/osaf/libs/common/logsv/include/lgsv_msg.h >> --- a/osaf/libs/common/logsv/include/lgsv_msg.h >> +++ b/osaf/libs/common/logsv/include/lgsv_msg.h >> @@ -76,8 +76,8 @@ typedef struct { >> typedef struct { >> uint32_t client_id; >> SaNameT lstr_name; >> - char logFileName[NAME_MAX]; >> - char logFilePathName[PATH_MAX]; >> + char *logFileName; >> + char *logFilePathName; >> SaUint64T maxLogFileSize; >> SaUint32T maxLogRecordSize; >> SaBoolT haProperty; >> diff --git a/osaf/services/saf/logsv/lgs/Makefile.am >> b/osaf/services/saf/logsv/lgs/Makefile.am >> --- a/osaf/services/saf/logsv/lgs/Makefile.am >> +++ b/osaf/services/saf/logsv/lgs/Makefile.am >> @@ -24,17 +24,17 @@ SUBDIRS = scripts >> noinst_HEADERS = \ >> lgs_cb.h \ >> lgs_fmt.h \ >> - lgs_mbcsv.h \ >> - lgs_mbcsv_v1.h \ >> - lgs_mbcsv_v2.h \ >> lgs_util.h \ >> lgs_evt.h \ >> lgs.h \ >> lgs_stream.h \ >> lgs_file.h \ >> lgs_filehdl.h \ >> + lgs_config.h \ >> + lgs_mbcsv.h \ >> + lgs_mbcsv_v1.h \ >> + lgs_mbcsv_v2.h \ >> lgs_mbcsv_v3.h \ >> - lgs_config.h \ >> lgs_mbcsv_v5.h >> >> osaf_execbindir = $(pkglibdir) >> @@ -53,15 +53,15 @@ osaflogd_SOURCES = \ >> lgs_fmt.cc \ >> lgs_imm.cc \ >> lgs_main.cc \ >> - lgs_mbcsv.cc \ >> lgs_config.cc \ >> - lgs_mbcsv_v1.cc \ >> - lgs_mbcsv_v2.cc \ >> lgs_mds.cc \ >> lgs_stream.cc \ >> lgs_util.cc \ >> lgs_file.cc \ >> lgs_filehdl.cc \ >> + lgs_mbcsv.cc \ >> + lgs_mbcsv_v1.cc \ >> + lgs_mbcsv_v2.cc \ >> lgs_mbcsv_v3.cc \ >> lgs_mbcsv_v5.cc >> >> diff --git a/osaf/services/saf/logsv/lgs/lgs.h >> b/osaf/services/saf/logsv/lgs/lgs.h >> --- a/osaf/services/saf/logsv/lgs/lgs.h >> +++ b/osaf/services/saf/logsv/lgs/lgs.h >> @@ -94,14 +94,16 @@ extern uint32_t lgs_mds_init(lgs_cb_t *c >> extern uint32_t lgs_mds_finalize(lgs_cb_t *cb); >> extern uint32_t lgs_mds_change_role(lgs_cb_t *cb); >> extern uint32_t lgs_mds_msg_send(lgs_cb_t *cb, >> - lgsv_msg_t *msg, >> - MDS_DEST *dest, >> MDS_SYNC_SND_CTXT *mds_ctxt, MDS_SEND_PRIORITY_TYPE prio); >> + lgsv_msg_t *msg, >> + MDS_DEST *dest, >> + >> MDS_SYNC_SND_CTXT *mds_ctxt, >> + >> MDS_SEND_PRIORITY_TYPE prio); >> >> extern SaAisErrorT lgs_imm_create_configStream(lgs_cb_t *cb); >> extern void logRootDirectory_filemove( >> - const char *new_logRootDirectory, >> - const char *old_logRootDirectory, >> - time_t *cur_time_in); >> + const std::string &new_logRootDirectory, >> + const std::string &old_logRootDirectory, >> + time_t *cur_time_in); >> extern void logDataGroupname_fileown(const char >> *new_logDataGroupname); >> >> >> diff --git a/osaf/services/saf/logsv/lgs/lgs_config.cc >> b/osaf/services/saf/logsv/lgs/lgs_config.cc >> --- a/osaf/services/saf/logsv/lgs/lgs_config.cc >> +++ b/osaf/services/saf/logsv/lgs/lgs_config.cc >> @@ -109,7 +109,7 @@ static struct lgs_conf_def_t { >> */ >> typedef struct _lgs_conf_t { >> /* --- Corresponds to IMM Class SaLogConfig --- */ >> - char logRootDirectory[PATH_MAX]; >> + std::string logRootDirectory; >> char logDataGroupname[UT_NAMESIZE]; >> char logStreamFileFormat[MAX_FIELD_SIZE]; >> SaUint32T logMaxLogrecsize; >> @@ -164,7 +164,7 @@ typedef struct _lgs_conf_t { >> logFileSysConfig_cnfflag = LGS_CNF_DEF; >> logStreamFileFormat_cnfflag = LGS_CNF_DEF; >> >> - (void) strcpy(logRootDirectory, >> lgs_conf_def.logRootDirectory); >> + logRootDirectory = >> lgs_conf_def.logRootDirectory; >> (void) strcpy(logDataGroupname, >> lgs_conf_def.logDataGroupname); >> (void) strcpy(logStreamFileFormat, >> lgs_conf_def.logStreamFileFormat); >> logMaxLogrecsize = >> lgs_conf_def.logMaxLogrecsize; >> @@ -383,8 +383,7 @@ int lgs_cfg_update(const lgs_config_chg_ >> >> /* Update config data */ >> if (strcmp(name_str, LOG_ROOT_DIRECTORY) >> == 0) { >> - (void) >> snprintf(lgs_conf.logRootDirectory, PATH_MAX, >> - "%s", value_str); >> + lgs_conf.logRootDirectory = >> value_str; >> lgs_conf.logRootDirectory_cnfflag >> = LGS_CNF_OBJ; >> } else if (strcmp(name_str, >> LOG_DATA_GROUPNAME) == 0) { >> (void) >> snprintf(lgs_conf.logDataGroupname, UT_NAMESIZE, >> @@ -461,17 +460,33 @@ int lgs_cfg_update(const lgs_config_chg_ >> * @param root_str_in[in] Root path to verify >> * @return -1 on error >> */ >> -int lgs_cfg_verify_root_dir(char *root_str_in) >> +int lgs_cfg_verify_root_dir(const std::string &root_str_in) >> { >> int rc = 0; >> - size_t n_max = PATH_MAX+1; >> - size_t n = strnlen(root_str_in, n_max); >> + log_stream_t *stream = NULL; >> + size_t n = root_str_in.size(); >> + >> if (n > PATH_MAX) { >> LOG_NO("verify_root_dir Fail. Path > >> PATH_MAX"); >> rc = -1; >> goto done; >> } >> >> + /** >> + * Make sure that the path >> /rootPath/streamPath/<fileName><tail> >> + * must not be larger than PATH_MAX. >> + */ >> + stream = log_stream_getnext_by_name(NULL); >> + while (stream != NULL) { >> + if (lgs_is_valid_pathlength(stream->pathName, >> stream->fileName, >> + >> root_str_in) == >> false) { >> + TRACE("The rootPath is invalid >> (%s)", root_str_in.c_str()); >> + rc = -1; >> + goto done; >> + } >> + stream = >> log_stream_getnext_by_name(stream->name); >> + } >> + >> if (lgs_path_is_writeable_dir_h(root_str_in) == false) { >> LOG_NO("path_is_writeable_dir... Fail"); >> rc = -1; >> @@ -658,11 +673,10 @@ static int lgs_cfg_verify_log_filesys_co >> * @param root_str_in[in] Root path to verify >> * @return -1 on error >> */ >> -static int verify_root_dir_init(char *root_str_in) >> +static int verify_root_dir_init(const std::string &root_str_in) >> { >> int rc = 0; >> - size_t n_max = PATH_MAX+1; >> - size_t n = strnlen(root_str_in, n_max); >> + size_t n = root_str_in.size(); >> if (n > PATH_MAX) { >> LOG_NO("verify_root_dir Fail. Path > >> PATH_MAX"); >> rc = -1; >> @@ -687,7 +701,7 @@ static int verify_all_init() >> TRACE_ENTER(); >> >> if (verify_root_dir_init(lgs_conf.logRootDirectory) == -1) { >> - strcpy(lgs_conf.logRootDirectory, >> lgs_conf_def.logRootDirectory); >> + lgs_conf.logRootDirectory = >> lgs_conf_def.logRootDirectory; >> lgs_conf.logRootDirectory_cnfflag = >> LGS_CNF_DEF; >> rc = -1; >> } >> @@ -813,15 +827,11 @@ static void read_logsv_config_obj_2() { >> value = attribute->attrValues[0]; >> >> if (!strcmp(attribute->attrName, >> LOG_ROOT_DIRECTORY)) { >> - n = >> snprintf(lgs_conf.logRootDirectory, PATH_MAX, "%s", >> - >> *((char **) value)); >> - if (n >= PATH_MAX) { >> - LOG_WA("LOG root >> dir read from config object is > PATH_MAX"); >> - >> lgs_conf.logRootDirectory[0] = '\0'; >> - } else { >> + lgs_conf.logRootDirectory = >> *(static_cast<char **>(value)); >> + if >> (lgs_conf.logRootDirectory.size() > PATH_MAX) { >> >> lgs_conf.logRootDirectory_cnfflag = LGS_CNF_OBJ; >> TRACE("Conf obj; >> logRootDirectory: %s", >> - >> lgs_conf.logRootDirectory); >> + >> lgs_conf.logRootDirectory.c_str()); >> } >> } else if (!strcmp(attribute->attrName, >> LOG_DATA_GROUPNAME)) { >> n = >> snprintf(lgs_conf.logDataGroupname, UT_NAMESIZE, "%s", >> @@ -923,12 +933,8 @@ static void read_log_config_environ_var_ >> if (lgs_conf.logRootDirectory_cnfflag == LGS_CNF_DEF) { >> /* Has not been set when reading config object >> */ >> if ((val_str = >> getenv("LOGSV_ROOT_DIRECTORY")) != NULL) { >> - n = >> snprintf(lgs_conf.logRootDirectory, PATH_MAX, "%s", val_str); >> - if (n >= PATH_MAX) { >> - /* Fail */ >> - LOG_WA("LOG root >> dir read from config file is > PATH_MAX"); >> - >> lgs_conf.logRootDirectory[0] = '\0'; >> - } else { >> + lgs_conf.logRootDirectory = >> val_str; >> + if >> (lgs_conf.logRootDirectory.size() > PATH_MAX) { >> >> lgs_conf.logRootDirectory_cnfflag = LGS_CNF_ENV; >> } >> } else { >> @@ -936,7 +942,8 @@ static void read_log_config_environ_var_ >> } >> } >> TRACE("logRootDirectory \"%s\", cnfflag '%s'", >> - lgs_conf.logRootDirectory, >> cnfflag_str(lgs_conf.logRootDirectory_cnfflag)); >> + lgs_conf.logRootDirectory.c_str(), >> + >> cnfflag_str(lgs_conf.logRootDirectory_cnfflag)); >> >> /* logDataGroupname >> * Rule: Object has precedence >> @@ -1184,7 +1191,7 @@ const void *lgs_cfg_get(lgs_logconfGet_t >> >> switch (param) { >> case LGS_IMM_LOG_ROOT_DIRECTORY: >> - value_ptr = lgs_conf.logRootDirectory; >> + value_ptr = const_cast<char >> *>(lgs_conf.logRootDirectory.c_str()); >> break; >> case LGS_IMM_DATA_GROUPNAME: >> value_ptr = lgs_conf.logDataGroupname; >> @@ -1241,7 +1248,7 @@ const void *lgs_cfg_get(lgs_logconfGet_t >> * return: true = Path is valid >> * false = Path is invalid >> */ >> -bool lgs_path_is_writeable_dir_h(const char *pathname) >> +bool lgs_path_is_writeable_dir_h(const std::string &pathname) >> { >> bool is_writeable_dir = false; >> >> @@ -1251,20 +1258,15 @@ bool lgs_path_is_writeable_dir_h(const c >> >> TRACE_ENTER(); >> >> - TRACE("%s - pathname \"%s\"",__FUNCTION__,pathname); >> + TRACE("%s - pathname \"%s\"", __FUNCTION__, >> pathname.c_str()); >> >> - size_t params_in_size = strlen(pathname)+1; >> - if (params_in_size > PATH_MAX) { >> - is_writeable_dir = false; >> - LOG_WA("Path > PATH_MAX"); >> - goto done; >> - } >> + size_t params_in_size = pathname.size() + 1; >> >> /* Allocate memory for parameter */ >> params_in_p = malloc(params_in_size); >> >> /* Fill in path */ >> - memcpy(params_in_p, pathname, params_in_size); >> + memcpy(params_in_p, pathname.c_str(), params_in_size); >> >> /* Fill in API structure */ >> apipar.req_code_in = LGSF_CHECKDIR; >> @@ -1286,7 +1288,6 @@ bool lgs_path_is_writeable_dir_h(const c >> >> free(params_in_p); >> >> -done: >> TRACE_LEAVE2("is_writeable_dir = %d",is_writeable_dir); >> return is_writeable_dir; >> } >> @@ -1302,15 +1303,14 @@ done: >> * >> * @param root_path_str >> */ >> -void lgs_rootpathconf_set(const char *root_path_str) >> +void lgs_rootpathconf_set(const std::string &root_path_str) >> { >> /* Lock mutex while config data is written */ >> osaf_mutex_lock_ordie(&lgs_config_data_mutex); >> >> - (void) snprintf(lgs_conf.logRootDirectory, PATH_MAX, "%s", >> - root_path_str); >> - TRACE("%s logRootDirectory updated to >> \"%s\"",__FUNCTION__, >> - lgs_conf.logRootDirectory); >> + lgs_conf.logRootDirectory = root_path_str; >> + TRACE("%s logRootDirectory updated to \"%s\"", >> __FUNCTION__, >> + lgs_conf.logRootDirectory.c_str()); >> >> osaf_mutex_unlock_ordie(&lgs_config_data_mutex); >> } >> @@ -1523,7 +1523,7 @@ void lgs_trace_config() >> >> TRACE("===== LOG Configuration Start ====="); >> TRACE("logRootDirectory\t\t \"%s\",\t %s", >> - lgs_conf.logRootDirectory, >> + lgs_conf.logRootDirectory.c_str(), >> cnfflag_str(lgs_conf.logRootDirectory_cnfflag)); >> TRACE("logDataGroupname\t\t \"%s\",\t %s", >> lgs_conf.logDataGroupname, >> diff --git a/osaf/services/saf/logsv/lgs/lgs_config.h >> b/osaf/services/saf/logsv/lgs/lgs_config.h >> --- a/osaf/services/saf/logsv/lgs/lgs_config.h >> +++ b/osaf/services/saf/logsv/lgs/lgs_config.h >> @@ -20,6 +20,7 @@ >> >> #include <stdbool.h> >> #include <stdint.h> >> +#include <string> >> >> #include "saImmOi.h" >> #include "saAmf.h" >> @@ -70,7 +71,7 @@ typedef struct config_chkpt { >> */ >> void lgs_cfg_init(SaImmOiHandleT immOiHandle, SaAmfHAStateT ha_state); >> const void *lgs_cfg_get(lgs_logconfGet_t param); >> -bool lgs_path_is_writeable_dir_h(const char *pathname); >> +bool lgs_path_is_writeable_dir_h(const std::string &pathname); >> void lgs_cfgupd_list_create(const char *name_str, char *value_str, >> lgs_config_chg_t *config_data); >> char *lgs_cfgupd_list_read(char **name_str, char **value_str, >> @@ -81,14 +82,14 @@ int lgs_cfg_update(const lgs_config_chg_ >> * Functions for updating some parameters. Used to support check-point >> before >> * version 5 >> */ >> -void lgs_rootpathconf_set(const char *root_path_str); >> +void lgs_rootpathconf_set(const std::string &root_path_str); >> void lgs_groupnameconf_set(const char *data_groupname_str); >> >> /* >> * Parameter value validation functions. Validates parameters. See function >> * headers for validation rules >> */ >> -int lgs_cfg_verify_root_dir(char *root_str_in); >> +int lgs_cfg_verify_root_dir(const std::string &root_str_in); >> int lgs_cfg_verify_log_data_groupname(char *group_name); >> int lgs_cfg_verify_log_file_format(const char* log_file_format); >> int lgs_cfg_verify_max_logrecsize(uint32_t max_logrecsize_in); >> diff --git a/osaf/services/saf/logsv/lgs/lgs_evt.cc >> b/osaf/services/saf/logsv/lgs/lgs_evt.cc >> --- a/osaf/services/saf/logsv/lgs/lgs_evt.cc >> +++ b/osaf/services/saf/logsv/lgs/lgs_evt.cc >> @@ -745,9 +745,9 @@ static uint32_t lgs_ckpt_stream_open(lgs >> ckpt_rec_open_ptr->clientId = >> open_sync_param->client_id; >> ckpt_rec_open_ptr->streamId = logStream- >> >streamId; >> >> - ckpt_rec_open_ptr->logFile = logStream- >> >fileName; >> - ckpt_rec_open_ptr->logPath = logStream- >> >pathName; >> - ckpt_rec_open_ptr->logFileCurrent = >> logStream->logFileCurrent; >> + ckpt_rec_open_ptr->logFile = const_cast<char >> *>(logStream->fileName.c_str()); >> + ckpt_rec_open_ptr->logPath = const_cast<char >> *>(logStream->pathName.c_str()); >> + ckpt_rec_open_ptr->logFileCurrent = >> const_cast<char *>(logStream->logFileCurrent.c_str()); >> ckpt_rec_open_ptr->fileFmt = logStream- >> >logFileFormat; >> ckpt_rec_open_ptr->logStreamName = >> logStream->name; >> >> @@ -781,7 +781,6 @@ static SaAisErrorT create_new_app_stream >> SaAisErrorT rc = SA_AIS_OK; >> log_stream_t *stream; >> SaBoolT twelveHourModeFlag; >> - uint32_t len = 0; >> SaUint32T logMaxLogrecsize_conf = 0; >> >> TRACE_ENTER(); >> @@ -827,11 +826,26 @@ static SaAisErrorT create_new_app_stream >> goto done; >> } >> >> + /* Verify if logFileName length is valid */ >> + if (lgs_is_valid_filelength(open_sync_param->logFileName) == >> false) { >> + TRACE("logFileName is invalid"); >> + rc = SA_AIS_ERR_INVALID_PARAM; >> + goto done; >> + } >> + >> + /* Verify if logFilePathName length is valid */ >> + if (lgs_is_valid_pathlength(open_sync_param- >> >logFilePathName, >> + >> open_sync_param->logFileName) == false) { >> + TRACE("logFilePathName is invalid"); >> + rc = SA_AIS_ERR_INVALID_PARAM; >> + goto done; >> + } >> + >> /* Verify that path and file are unique */ >> stream = log_stream_getnext_by_name(NULL); >> while (stream != NULL) { >> - if ((strncmp(stream->fileName, >> open_sync_param->logFileName, NAME_MAX) == 0) && >> - (strncmp(stream->pathName, >> open_sync_param->logFilePathName, SA_MAX_NAME_LENGTH) == 0)) { >> + if ((stream->fileName == open_sync_param- >> >logFileName) && >> + (stream->pathName == open_sync_param- >> >logFilePathName)) { >> TRACE("pathname already exist"); >> rc = >> SA_AIS_ERR_INVALID_PARAM; >> goto done; >> @@ -856,22 +870,6 @@ static SaAisErrorT create_new_app_stream >> goto done; >> } >> >> - /* Verify if logFileName length is valid */ >> - len = strlen(open_sync_param->logFileName); >> - if ((len == 0) || (len > LOG_NAME_MAX)) { >> - TRACE("logFileName is invalid"); >> - rc = SA_AIS_ERR_INVALID_PARAM; >> - goto done; >> - } >> - >> - /* Verify if logFilePathName length is valid */ >> - len = strlen(open_sync_param->logFilePathName); >> - if ((len == 0) || (len > PATH_MAX)) { >> - TRACE("logFilePathName is invalid"); >> - rc = SA_AIS_ERR_INVALID_PARAM; >> - goto done; >> - } >> - >> stream = log_stream_new(&open_sync_param->lstr_name, >> open_sync_param- >> >logFileName, >> open_sync_param- >> >logFilePathName, >> @@ -920,13 +918,13 @@ static SaAisErrorT file_attribute_cmp(lg >> TRACE("logFileFullAction create params differs, >> new: %d, old: %d", >> open_sync_param->logFileFullAction, >> applicationStream->logFullAction); >> rs = SA_AIS_ERR_EXIST; >> - } else if (strcmp(applicationStream->fileName, >> open_sync_param->logFileName) != 0) { >> + } else if (applicationStream->fileName != open_sync_param- >> >logFileName) { >> TRACE("logFileName differs, new: %s existing: >> %s", >> - open_sync_param->logFileName, >> applicationStream->fileName); >> + open_sync_param->logFileName, >> applicationStream->fileName.c_str()); >> rs = SA_AIS_ERR_EXIST; >> - } else if (strcmp(applicationStream->pathName, >> open_sync_param->logFilePathName) != 0) { >> + } else if (applicationStream->pathName != open_sync_param- >> >logFilePathName) { >> TRACE("log file path differs, new: %s existing: >> %s", >> - open_sync_param->logFilePathName, >> applicationStream->pathName); >> + open_sync_param->logFilePathName, >> applicationStream->pathName.c_str()); >> rs = SA_AIS_ERR_EXIST; >> } else if ((open_sync_param->logFileFmt != NULL) && >> strcmp(applicationStream->logFileFormat, >> open_sync_param->logFileFmt) != 0) { >> @@ -1047,7 +1045,12 @@ static uint32_t proc_stream_open_msg(lgs >> if (ais_rv == SA_AIS_OK) { >> (void)lgs_ckpt_stream_open(cb, logStream, >> open_sync_param); >> } >> + >> + // These memories are allocated in MDS log open decode >> callback. >> free(open_sync_param->logFileFmt); >> + free(open_sync_param->logFilePathName); >> + free(open_sync_param->logFileName); >> + >> TRACE_LEAVE(); >> return rc; >> } >> @@ -1217,7 +1220,8 @@ static uint32_t proc_write_log_async_msg >> >> ckpt_v2.ckpt_rec.write_log.recordId = stream->logRecordId; >> >> ckpt_v2.ckpt_rec.write_log.streamId = stream->streamId; >> >> ckpt_v2.ckpt_rec.write_log.curFileSize = stream->curFileSize; >> - >> ckpt_v2.ckpt_rec.write_log.logFileCurrent = stream- >> >logFileCurrent; >> + >> ckpt_v2.ckpt_rec.write_log.logFileCurrent = const_cast<char >> *>( >> + stream->logFileCurrent.c_str()); >> >> ckpt_v2.ckpt_rec.write_log.logRecord = logOutputString; >> >> ckpt_v2.ckpt_rec.write_log.c_file_close_time_stamp = >> stream->act_last_close_timestamp; >> ckpt_ptr = &ckpt_v2; >> @@ -1229,7 +1233,8 @@ static uint32_t proc_write_log_async_msg >> >> ckpt_v1.ckpt_rec.write_log.recordId = stream->logRecordId; >> >> ckpt_v1.ckpt_rec.write_log.streamId = stream->streamId; >> >> ckpt_v1.ckpt_rec.write_log.curFileSize = stream->curFileSize; >> - >> ckpt_v1.ckpt_rec.write_log.logFileCurrent = stream- >> >logFileCurrent; >> + >> ckpt_v1.ckpt_rec.write_log.logFileCurrent = const_cast<char >> *>( >> + stream->logFileCurrent.c_str()); >> ckpt_ptr = &ckpt_v1; >> } >> >> diff --git a/osaf/services/saf/logsv/lgs/lgs_filehdl.cc >> b/osaf/services/saf/logsv/lgs/lgs_filehdl.cc >> --- a/osaf/services/saf/logsv/lgs/lgs_filehdl.cc >> +++ b/osaf/services/saf/logsv/lgs/lgs_filehdl.cc >> @@ -338,99 +338,63 @@ int make_log_dir_hdl(void *indata, void >> int rc = 0; >> int mldh_rc = 0; >> mld_in_t *params_in = static_cast<mld_in_t *>(indata); >> - char *out_path = static_cast<char *>(outdata); >> - char *relpath = params_in->rel_path; >> - char *rootpath = params_in->root_dir; >> - char dir_to_make[PATH_MAX]; >> - char mpath[PATH_MAX]; >> - char *spath_p; >> - char *epath_p; >> - struct stat statbuf; >> - int n; >> + std::string relpath = params_in->rel_path; >> + std::string rootpath = params_in->root_dir; >> + std::string dir_to_make; >> + std::string mpath; >> + const char *spath_p = NULL; >> + const char *epath_p = NULL; >> int path_len = 0; >> - char *rootpp = NULL; >> >> TRACE_ENTER(); >> >> - TRACE("rootpath \"%s\"",rootpath); >> - TRACE("relpath \"%s\"",relpath); >> + TRACE("rootpath \"%s\"", rootpath.c_str()); >> + TRACE("relpath \"%s\"", relpath.c_str()); >> >> osaf_mutex_unlock_ordie(&lgs_ftcom_mutex); /* UNLOCK >> Critical section */ >> /* >> * Create root directory if it does not exists. >> - * TBD. Handle via separate ticket >> - * (Create the default root path regardless of what is set in the >> - * configuration object.) >> - */ >> - out_path[0] = '\0'; >> - if (lstat(rootpath, &statbuf) != 0) { >> -#if 0 >> - rootpath = PKGLOGDIR; >> -#endif >> - n = snprintf(out_path, max_outsize, "%s", >> rootpath); >> - if (n < 0 || static_cast<uint32_t>(n) >= >> max_outsize) { >> - LOG_WA("Invalid root path > >> max_outsize"); >> - mldh_rc = -1; >> - goto done; >> - } >> - LOG_NO("LOG Root path does not exist. Will be >> created"); >> - TRACE("%s - create rootpath >> \"%s\"",__FUNCTION__,rootpath); >> - } >> - >> - /* >> * Create root path without preceding '/' and ending '/' >> * Example: ro1/ro2/ro3 >> - * Check that not > PATH_MAX >> */ >> - n = snprintf(mpath, PATH_MAX, "%s", rootpath); >> - if (n >= PATH_MAX) { >> - LOG_WA("Could not create path, rootpath > >> PATH_MAX"); >> - mldh_rc = -1; >> - goto done; >> - } >> >> - rootpp = mpath; >> - while (*rootpp == '/') rootpp++; /* Remove preceding '/' */ >> - while (mpath[strlen(mpath)-1] == '/') { /* Remove trailing '/' if >> needed */ >> - mpath[strlen(mpath)-1] = '\0'; >> - } >> + /* Remove preceding '/' */ >> + rootpath.erase(0, rootpath.find_first_not_of('/')); >> + /* Remove trailing '/' */ >> + rootpath.erase(rootpath.find_last_not_of('/') + 1); >> >> /* >> * Add relative path. Shall end with '/' >> * Example: ro1/ro2/ro3/re1/re2/re3/ >> - * Check that not > PATH_MAX >> */ >> - if (relpath[strlen(relpath)-1] != '/') { >> - n = snprintf(dir_to_make, PATH_MAX, >> "/%s/%s/", rootpp, relpath); >> + if (relpath[relpath.size() - 1] != '/') { >> + dir_to_make = "/" + rootpath + "/" + relpath + >> "/"; >> } else { >> - n = snprintf(dir_to_make, PATH_MAX, >> "/%s/%s", rootpp, relpath); >> + dir_to_make = "/" + rootpath + "/" + relpath; >> } >> - if (n >= PATH_MAX) { >> - LOG_WA("Could not create path > >> PATH_MAX"); >> - mldh_rc = -1; >> - goto done; >> - } >> - TRACE("%s - Path to create >> \"%s\"",__FUNCTION__,dir_to_make); >> + >> + TRACE("%s - Path to create \"%s\"", __FUNCTION__, >> dir_to_make.c_str()); >> >> /* Create the path */ >> - spath_p = epath_p = dir_to_make; >> + spath_p = epath_p = dir_to_make.c_str(); >> while ((epath_p = strchr(epath_p, '/')) != NULL) { >> if (epath_p == spath_p) { >> epath_p++; >> continue; /* Don't try to create >> path "/" */ >> } >> + >> epath_p++; >> path_len = epath_p - spath_p; >> - strncpy(mpath, spath_p, path_len); >> - mpath[path_len] = '\0'; >> - rc = mkdir(mpath, S_IRWXU | S_IRWXG | >> S_IRWXO); >> + >> + mpath.assign(spath_p, path_len); >> + rc = mkdir(mpath.c_str(), S_IRWXU | S_IRWXG | >> S_IRWXO); >> if ((rc != 0) && (errno != EEXIST)) { >> - LOG_ER("mkdir \"%s\" Fail %s", >> mpath, strerror(errno)); >> + LOG_ER("mkdir \"%s\" Fail %s", >> mpath.c_str(), strerror(errno)); >> mldh_rc = -1; >> goto done; >> } >> } >> - TRACE("%s - Dir \"%s\" created",__FUNCTION__, mpath); >> + TRACE("%s - Dir \"%s\" created", __FUNCTION__, >> mpath.c_str()); >> >> done: >> osaf_mutex_lock_ordie(&lgs_ftcom_mutex); /* LOCK after >> critical section */ >> @@ -606,12 +570,16 @@ static int check_oldest(char *line, char >> } >> >> /* Filter function used by scandir. */ >> -static char file_prefix[SA_MAX_NAME_LENGTH]; >> +static std::string file_prefix; >> + >> static int filter_func(const struct dirent *finfo) >> { >> int ret; >> int filenameLen = strlen(finfo->d_name) - strlen(".log"); >> - ret = strncmp(file_prefix, finfo->d_name, strlen(file_prefix)) >> || strcmp(finfo->d_name + filenameLen, ".log"); >> + >> + ret = strncmp(file_prefix.c_str(), finfo->d_name, >> file_prefix.size()) >> + || strcmp(finfo->d_name + filenameLen, >> ".log"); >> + >> return !ret; >> } >> >> @@ -627,7 +595,7 @@ int get_number_of_log_files_hdl(void *in >> { >> struct dirent **namelist; >> int n, old_date = -1, old_time = -1, old_ind = -1, files, i, failed = >> 0; >> - char path[PATH_MAX]; >> + std::string path; >> gnolfh_in_t *params_in; >> char *oldest_file; >> int rc = 0; >> @@ -638,32 +606,20 @@ int get_number_of_log_files_hdl(void *in >> oldest_file = static_cast<char *>(outdata); >> >> /* Initialize the filter */ >> - n = snprintf(file_prefix, SA_MAX_NAME_LENGTH, "%s", >> params_in->file_name); >> - if (n >= SA_MAX_NAME_LENGTH) { >> - rc = -1; >> - LOG_WA("file_prefix > >> SA_MAX_NAME_LENGTH"); >> - goto done_exit; >> - } >> - >> - n = snprintf(path, PATH_MAX, "%s/%s", >> - params_in->logsv_root_dir, >> params_in->pathName); >> - if (n >= PATH_MAX) { >> - LOG_WA("path > PATH_MAX"); >> - rc = -1; >> - goto done_exit; >> - } >> + file_prefix = params_in->file_name; >> + path = std::string(params_in->logsv_root_dir) + "/" + >> params_in->pathName; >> >> osaf_mutex_unlock_ordie(&lgs_ftcom_mutex); /* UNLOCK >> critical section */ >> - files = n = scandir(path, &namelist, filter_func, alphasort); >> + files = n = scandir(path.c_str(), &namelist, filter_func, >> alphasort); >> + osaf_mutex_lock_ordie(&lgs_ftcom_mutex); /* LOCK after >> critical section */ >> >> - osaf_mutex_lock_ordie(&lgs_ftcom_mutex); /* LOCK after >> critical section */ >> if (n == -1 && errno == ENOENT) { >> rc = 0; >> goto done_exit; >> } >> >> if (n < 0) { >> - LOG_WA("scandir:%s - %s", strerror(errno), >> path); >> + LOG_WA("scandir:%s - %s", strerror(errno), >> path.c_str()); >> rc = -1; >> goto done_exit; >> } >> @@ -685,7 +641,7 @@ int get_number_of_log_files_hdl(void *in >> if (old_ind != -1) { >> TRACE_1("oldest: %s", namelist[old_ind]- >> >d_name); >> n = snprintf(oldest_file, max_outsize, "%s/%s", >> - path, >> namelist[old_ind]->d_name); >> + path.c_str(), namelist[old_ind]- >> >d_name); >> if (n < 0 || static_cast<uint32_t>(n) >= >> max_outsize) { >> LOG_WA("oldest_file > >> max_outsize"); >> rc = -1; >> @@ -718,7 +674,8 @@ done_exit: >> * >> * @return int, 0 on success or -1 if error >> */ >> -int own_log_files_by_group_hdl(void *indata, void *outdata, size_t >> max_outsize) { >> +int own_log_files_by_group_hdl(void *indata, void *outdata, size_t >> max_outsize) >> +{ >> struct dirent **namelist; >> int n, files, i; >> olfbgh_t *params_in; >> @@ -730,16 +687,11 @@ int own_log_files_by_group_hdl(void *ind >> params_in = static_cast<olfbgh_t *>(indata); >> >> /* Set file prefix filter */ >> - n = snprintf(file_prefix, SA_MAX_NAME_LENGTH, "%s", >> params_in->file_name); >> - if (n >= SA_MAX_NAME_LENGTH) { >> - rc = -1; >> - LOG_WA("file_prefix > >> SA_MAX_NAME_LENGTH"); >> - goto done_exit; >> - } >> + file_prefix = params_in->file_name; >> >> osaf_mutex_unlock_ordie(&lgs_ftcom_mutex); /* UNLOCK >> critical section */ >> - >> files = n = scandir(params_in->dir_path, &namelist, filter_func, >> alphasort); >> + osaf_mutex_lock_ordie(&lgs_ftcom_mutex); /* LOCK after >> critical section */ >> >> if (n == -1 && errno == ENOENT) { >> rc = 0; >> @@ -760,28 +712,22 @@ int own_log_files_by_group_hdl(void *ind >> gid = lgs_get_data_gid(params_in->groupname); >> >> while (n--) { >> - char file[PATH_MAX]; >> - int len = snprintf(file, PATH_MAX, "%s/%s", >> - >> params_in->dir_path, namelist[n]->d_name); >> - if (len >= PATH_MAX) { >> - LOG_WA("path > PATH_MAX"); >> - rc = -1; >> - goto done_free; >> - } >> - TRACE_3("%s", file); >> - if (chown(file, (uid_t) -1, gid) != 0) { >> + std::string file; >> + file = std::string(params_in->dir_path) + "/" + >> namelist[n]->d_name; >> + >> + TRACE_3("%s", file.c_str()); >> + >> + if (chown(file.c_str(), (uid_t) -1, gid) != 0) { >> LOG_WA("Failed to change the >> ownership of %s - %s", namelist[n]->d_name, strerror(errno)); >> } >> } >> >> -done_free: >> /* Free scandir allocated memory */ >> for (i = 0; i < files; i++) >> free(namelist[i]); >> free(namelist); >> >> done_exit: >> - osaf_mutex_lock_ordie(&lgs_ftcom_mutex); /* LOCK after >> critical section */ >> TRACE_LEAVE(); >> return rc; >> } >> diff --git a/osaf/services/saf/logsv/lgs/lgs_filehdl.h >> b/osaf/services/saf/logsv/lgs/lgs_filehdl.h >> --- a/osaf/services/saf/logsv/lgs/lgs_filehdl.h >> +++ b/osaf/services/saf/logsv/lgs/lgs_filehdl.h >> @@ -42,9 +42,9 @@ >> * No typedef needed >> */ >> typedef struct { >> - char filepath[PATH_MAX]; /* Complete path to file */ >> + char *filepath; /* Complete path to file */ >> char groupname[UT_NAMESIZE]; /* Name of owner >> group */ >> -}fopen_in_t; >> +} fopen_in_t; >> >> /* >> * fileclose_hdl(..) >> @@ -67,31 +67,24 @@ typedef struct { >> * Parameter data_out_size must be set to PATH_MAX >> */ >> typedef struct { >> - char root_dir[PATH_MAX]; /* Implementer defined root >> directory */ >> - char rel_path[PATH_MAX]; /* Path to create */ >> -}mld_in_t; >> + char *root_dir; /* Implementer defined root directory */ >> + char *rel_path; /* Path to create */ >> +} mld_in_t; >> >> /* >> * get_number_of_log_files_hdl(..) >> */ >> typedef struct { >> /* File name prefix (name part before time stamps) */ >> - char file_name[SA_MAX_NAME_LENGTH]; >> + char *file_name; >> /* logsv_root_dir + pathName makes up the path to the log >> files >> * Note: The whole path cannot be a longer string than >> PATH_MAX >> */ >> - char logsv_root_dir[PATH_MAX]; >> - char pathName[PATH_MAX]; >> -}gnolfh_in_t; >> + char *logsv_root_dir; >> + char *pathName; >> +} gnolfh_in_t; >> >> - /* parameter [out] >> - * char str[PATH_MAX] >> - * No typdef needed >> - * Out parameter is a string of max PATH_MAX + NAME_MAX >> length >> - * Parameter data_out_size must be set to PATH_MAX + >> NAME_MAX. >> - */ >> - >> -/* >> +/* >> * write_log_record_hdl(..) >> * Outpar int errno_save >> */ >> @@ -115,7 +108,7 @@ typedef struct { >> SaUint32T maxFilesRotated; >> /* File information */ >> size_t file_path_size; /* Size of file_path incl. '\0' */ >> -}ccfh_t; >> +} ccfh_t; >> /* char logFileFormat[] >> * char file_path[] >> * Strings of varying length that shall be added >> @@ -126,11 +119,11 @@ typedef struct { >> * No out parameters >> */ >> typedef struct { >> - char dir_path[PATH_MAX]; /* Full path to stream directory */ >> + char *dir_path; /* Full path to stream directory */ >> /* File name prefix (name part before time stamps) */ >> - char file_name[SA_MAX_NAME_LENGTH]; >> + char *file_name; >> char groupname[UT_NAMESIZE]; /* Name of owner >> group */ >> -}olfbgh_t; >> +} olfbgh_t; >> >> /* >> * rename_file_hdl(..) >> diff --git a/osaf/services/saf/logsv/lgs/lgs_imm.cc >> b/osaf/services/saf/logsv/lgs/lgs_imm.cc >> --- a/osaf/services/saf/logsv/lgs/lgs_imm.cc >> +++ b/osaf/services/saf/logsv/lgs/lgs_imm.cc >> @@ -235,8 +235,8 @@ static uint32_t ckpt_stream_config(log_s >> ckpt_v2.header.data_len = 1; >> >> ckpt_v2.ckpt_rec.stream_cfg.name = (char >> *)stream->name; >> - ckpt_v2.ckpt_rec.stream_cfg.fileName = >> stream->fileName; >> - ckpt_v2.ckpt_rec.stream_cfg.pathName = >> stream->pathName; >> + ckpt_v2.ckpt_rec.stream_cfg.fileName = >> const_cast<char *>(stream->fileName.c_str()); >> + ckpt_v2.ckpt_rec.stream_cfg.pathName = >> const_cast<char *>(stream->pathName.c_str()); >> ckpt_v2.ckpt_rec.stream_cfg.maxLogFileSize = >> stream->maxLogFileSize; >> >> ckpt_v2.ckpt_rec.stream_cfg.fixedLogRecordSize = stream- >> >fixedLogRecordSize; >> ckpt_v2.ckpt_rec.stream_cfg.logFullAction = >> stream->logFullAction; >> @@ -244,7 +244,7 @@ static uint32_t ckpt_stream_config(log_s >> ckpt_v2.ckpt_rec.stream_cfg.maxFilesRotated = >> stream->maxFilesRotated; >> ckpt_v2.ckpt_rec.stream_cfg.logFileFormat = >> stream->logFileFormat; >> ckpt_v2.ckpt_rec.stream_cfg.severityFilter = >> stream->severityFilter; >> - ckpt_v2.ckpt_rec.stream_cfg.logFileCurrent = >> stream->logFileCurrent; >> + ckpt_v2.ckpt_rec.stream_cfg.logFileCurrent = >> const_cast<char *>(stream->logFileCurrent.c_str()); >> >> ckpt_v2.ckpt_rec.stream_cfg.c_file_close_time_stamp = >> stream->act_last_close_timestamp; >> ckpt_ptr = &ckpt_v2; >> } else { >> @@ -254,8 +254,8 @@ static uint32_t ckpt_stream_config(log_s >> ckpt_v1.header.data_len = 1; >> >> ckpt_v1.ckpt_rec.stream_cfg.name = (char >> *)stream->name; >> - ckpt_v1.ckpt_rec.stream_cfg.fileName = >> stream->fileName; >> - ckpt_v1.ckpt_rec.stream_cfg.pathName = >> stream->pathName; >> + ckpt_v1.ckpt_rec.stream_cfg.fileName = >> const_cast<char *>(stream->fileName.c_str()); >> + ckpt_v1.ckpt_rec.stream_cfg.pathName = >> const_cast<char *>(stream->pathName.c_str()); >> ckpt_v1.ckpt_rec.stream_cfg.maxLogFileSize = >> stream->maxLogFileSize; >> >> ckpt_v1.ckpt_rec.stream_cfg.fixedLogRecordSize = stream- >> >fixedLogRecordSize; >> ckpt_v1.ckpt_rec.stream_cfg.logFullAction = >> stream->logFullAction; >> @@ -263,7 +263,7 @@ static uint32_t ckpt_stream_config(log_s >> ckpt_v1.ckpt_rec.stream_cfg.maxFilesRotated = >> stream->maxFilesRotated; >> ckpt_v1.ckpt_rec.stream_cfg.logFileFormat = >> stream->logFileFormat; >> ckpt_v1.ckpt_rec.stream_cfg.severityFilter = >> stream->severityFilter; >> - ckpt_v1.ckpt_rec.stream_cfg.logFileCurrent = >> stream->logFileCurrent; >> + ckpt_v1.ckpt_rec.stream_cfg.logFileCurrent = >> const_cast<char *>(stream->logFileCurrent.c_str()); >> ckpt_ptr = &ckpt_v1; >> } >> >> @@ -735,15 +735,15 @@ static SaAisErrorT config_ccb_completed_ >> >> if (!strcmp(attribute->attrName, >> LOG_ROOT_DIRECTORY)) { >> if (attribute->attrValuesNumber >> != 0) { >> - char *pathName = >> *((char **)value); >> - rc = >> lgs_cfg_verify_root_dir(pathName); >> - if (rc == -1) { >> + std::string >> pathName = *(static_cast<char **>(value)); >> + if >> (lgs_cfg_verify_root_dir(pathName) != 0) { >> >> report_oi_error(immOiHandle, opdata->ccbId, >> - >> "pathName: %s is NOT accepted", pathName); >> + >> "pathName: %s is NOT accepted", >> + >> pathName.c_str()); >> ais_rc >> = SA_AIS_ERR_BAD_OPERATION; >> goto >> done; >> } >> - TRACE("pathName: >> %s is accepted", pathName); >> + TRACE("pathName: >> %s is accepted", pathName.c_str()); >> } >> } else if (!strcmp(attribute->attrName, >> LOG_DATA_GROUPNAME)) { >> if (attribute->attrValuesNumber >> == 0) { >> @@ -1000,18 +1000,18 @@ static lgs_stream_defval_t *get_SaLogStr >> * @return true if exists >> */ >> bool chk_filepath_stream_exist( >> - char *fileName, >> - char *pathName, >> - log_stream_t *stream, >> - enum CcbUtilOperationType operationType) >> + std::string &fileName, >> + std::string &pathName, >> + log_stream_t *stream, >> + enum CcbUtilOperationType operationType) >> { >> log_stream_t *i_stream = NULL; >> - char *i_fileName = NULL; >> - char *i_pathName = NULL; >> + std::string i_fileName; >> + std::string i_pathName; >> bool rc = false; >> >> TRACE_ENTER(); >> - TRACE("fileName \"%s\", pathName \"%s\"", fileName, >> pathName); >> + TRACE("fileName \"%s\", pathName \"%s\"", fileName.c_str(), >> pathName.c_str()); >> >> /* If a stream is modified only the name may be modified. The >> path name >> * must be fetched from the stream. >> @@ -1022,26 +1022,26 @@ bool chk_filepath_stream_exist( >> /* No stream to modify. Should >> never happen */ >> osafassert(0); >> } >> - if ((fileName == NULL) && (pathName == NULL)) >> { >> + if ((fileName.empty() == true) && >> (pathName.empty() == true)) { >> /* Nothing has changed */ >> TRACE("Nothing has changed"); >> return false; >> } >> - if (fileName == NULL) { >> + if (fileName.empty() == true) { >> i_fileName = stream->fileName; >> - TRACE("From stream: fileName >> \"%s\"", i_fileName); >> + TRACE("From stream: fileName >> \"%s\"", i_fileName.c_str()); >> } else { >> i_fileName = fileName; >> } >> - if (pathName == NULL) { >> + if (pathName.empty() == true) { >> i_pathName = stream- >> >pathName; >> - TRACE("From stream: pathName >> \"%s\"", i_pathName); >> + TRACE("From stream: pathName >> \"%s\"", i_pathName.c_str()); >> } else { >> i_pathName = pathName; >> } >> } else if (operationType == CCBUTIL_CREATE) { >> TRACE("CREATE"); >> - if ((fileName == NULL) || (pathName == NULL)) >> { >> + if ((fileName.empty() == true) || >> (pathName.empty() == true)) { >> /* Should never happen >> * A valid fileName and pathName >> is always given at create */ >> LOG_ER("fileName or pathName >> is not a string"); >> @@ -1060,8 +1060,8 @@ bool chk_filepath_stream_exist( >> i_stream = log_stream_getnext_by_name(NULL); >> while (i_stream != NULL) { >> TRACE("Check stream \"%s\"", i_stream- >> >name); >> - if ((strncmp(i_stream->fileName, i_fileName, >> NAME_MAX) == 0) && >> - (strncmp(i_stream->pathName, >> i_pathName, SA_MAX_NAME_LENGTH) == 0)) { >> + if ((i_stream->fileName == i_fileName) && >> + (i_stream->pathName == >> i_pathName)) { >> rc = true; >> break; >> } >> @@ -1253,10 +1253,10 @@ static SaAisErrorT check_attr_validity(S >> /* Attribute values to be checked >> */ >> /* Mandatory if create. Can be modified */ >> - char *i_fileName = NULL; >> + std::string i_fileName; >> bool i_fileName_mod = false; >> /* Mandatory if create. Cannot be changed (handled in class >> definition) */ >> - char *i_pathName = NULL; >> + std::string i_pathName; >> bool i_pathName_mod = false; >> /* Modification flag -> true if modified */ >> SaUint32T i_streamFixedLogRecordSize = 0; >> @@ -1306,7 +1306,7 @@ static SaAisErrorT check_attr_validity(S >> i_pathName = stream- >> >pathName; >> i_fileName = stream->fileName; >> TRACE("From stream: pathName >> \"%s\", fileName \"%s\"", >> - >> i_pathName, i_fileName); >> + >> i_pathName.c_str(), i_fileName.c_str()); >> } >> } else if (opdata->operationType == CCBUTIL_CREATE){ >> TRACE("Validate for CREATE"); >> @@ -1420,7 +1420,7 @@ static SaAisErrorT check_attr_validity(S >> */ >> if (i_pathName_mod) { >> TRACE("Checking >> saLogStreamPathName"); >> - if (i_pathName == NULL) { >> + if (i_pathName.empty() == true) { >> /* Must point to a >> string */ >> rc = >> SA_AIS_ERR_BAD_OPERATION; >> >> report_oi_error(immOiHandle, opdata->ccbId, >> @@ -1429,7 +1429,7 @@ static SaAisErrorT check_attr_validity(S >> goto done; >> } >> >> - if (strlen(i_pathName) > >> PATH_MAX) { >> + if >> (lgs_is_valid_pathlength(i_pathName, i_fileName) == false) { >> /* Path name is too >> long */ >> rc = >> SA_AIS_ERR_BAD_OPERATION; >> >> report_oi_error(immOiHandle, opdata->ccbId, >> @@ -1440,9 +1440,9 @@ static SaAisErrorT check_attr_validity(S >> >> if >> (lgs_relative_path_check_ts(i_pathName) == true) { >> >> report_oi_error(immOiHandle, opdata->ccbId, >> - >> "Path %s not valid", i_pathName); >> + >> "Path %s not valid", i_pathName.c_str()); >> rc = >> SA_AIS_ERR_BAD_OPERATION; >> - TRACE("Path %s not >> valid", i_pathName); >> + TRACE("Path %s not >> valid", i_pathName.c_str()); >> goto done; >> } >> } >> @@ -1453,7 +1453,7 @@ static SaAisErrorT check_attr_validity(S >> */ >> if (i_fileName_mod) { >> TRACE("Checking >> saLogStreamFileName"); >> - if (i_fileName == NULL) { >> + if (i_fileName.empty() == true) { >> /* Must point to a >> string */ >> rc = >> SA_AIS_ERR_BAD_OPERATION; >> >> report_oi_error(immOiHandle, opdata->ccbId, >> @@ -1462,20 +1462,22 @@ static SaAisErrorT check_attr_validity(S >> goto done; >> } >> >> - if (strlen(i_fileName) > >> LOG_NAME_MAX) { >> + if >> ((lgs_is_valid_pathlength(i_pathName, i_fileName) == false) || >> + >> (lgs_is_valid_filelength(i_fileName) == false)) { >> /* 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); >> + >> TRACE("saLogStreamFileName is so long"); >> goto done; >> } >> + >> /* Not allow special characters >> exising in file name */ >> if >> (lgs_has_special_char(i_fileName) == true) { >> /* Report failed if >> has special character in file name */ >> rc = >> SA_AIS_ERR_BAD_OPERATION; >> >> report_oi_error(immOiHandle, opdata->ccbId, >> - >> "Invalid saLogStreamFileName >> value"); >> + >> "Invalid saLogStreamFileName value"); >> TRACE("\t448 >> Invalid saLogStreamFileName value"); >> goto done; >> } >> @@ -1483,10 +1485,11 @@ static SaAisErrorT check_attr_validity(S >> if >> (chk_filepath_stream_exist(i_fileName, i_pathName, >> >> stream, opdata->operationType)) { >> >> report_oi_error(immOiHandle, opdata->ccbId, >> - >> "Path/file %s/%s already exist", i_pathName, i_fileName); >> + >> "Path/file %s/%s already exist", >> + >> i_pathName.c_str(), i_fileName.c_str()); >> rc = >> SA_AIS_ERR_BAD_OPERATION; >> TRACE("Path/file >> %s/%s already exist", >> - >> i_pathName, i_fileName); >> + >> i_pathName.c_str(), i_fileName.c_str()); >> goto done; >> } >> } >> @@ -1799,26 +1802,19 @@ static SaAisErrorT ccbCompletedCallback( >> * @param cur_time_in >> */ >> void logRootDirectory_filemove( >> - const char *new_logRootDirectory, >> - const char *old_logRootDirectory, >> - time_t *cur_time_in) >> + const std::string &new_logRootDirectory, >> + const std::string &old_logRootDirectory, >> + time_t *cur_time_in) >> { >> TRACE_ENTER(); >> log_stream_t *stream; >> - int n = 0; >> - char *current_logfile; >> - >> - /* Shall never happen */ >> - if (strlen(new_logRootDirectory) + 1 > PATH_MAX) { >> - LOG_ER("%s Root path > PATH_MAX! Abort", >> __FUNCTION__); >> - osafassert(0); >> - } >> + std::string current_logfile; >> >> /* Close and rename files at current path >> */ >> stream = log_stream_getnext_by_name(NULL); >> while (stream != NULL) { >> - TRACE("Handling file %s", stream- >> >logFileCurrent); >> + TRACE("Handling file %s", stream- >> >logFileCurrent.c_str()); >> >> if (lgs_cb->ha_state == SA_AMF_HA_ACTIVE) { >> current_logfile = stream- >> >logFileCurrent; >> @@ -1826,7 +1822,7 @@ void logRootDirectory_filemove( >> current_logfile = stream- >> >stb_logFileCurrent; >> } >> >> - TRACE("current_logfile \"%s\"",current_logfile); >> + TRACE("current_logfile \"%s\"", >> current_logfile.c_str()); >> >> if >> (log_stream_config_change(!LGS_STREAM_CREATE_FILES, >> >> old_logRootDirectory, stream, current_logfile, >> @@ -1848,12 +1844,9 @@ void logRootDirectory_filemove( >> >> /* Create the new log file based on updated >> configuration */ >> char *current_time = >> lgs_get_time(cur_time_in); >> - n = snprintf(stream->logFileCurrent, >> NAME_MAX, "%s_%s", stream->fileName, >> - current_time); >> - if (n >= NAME_MAX) { >> - LOG_ER("New log file could not >> be created for stream: %s", >> - >> stream->name); >> - } else if ((*stream->p_fd = >> log_file_open(new_logRootDirectory, >> + stream->logFileCurrent = stream->fileName + >> "_" + current_time; >> + >> + if ((*stream->p_fd = >> log_file_open(new_logRootDirectory, >> stream, stream->logFileCurrent, >> NULL)) == -1) { >> LOG_ER("New log file could not >> be created for stream: %s", >> >> stream->name); >> @@ -1862,7 +1855,7 @@ void logRootDirectory_filemove( >> /* Also update standby current file name >> * Used if standby and configured for split file >> system >> */ >> - strcpy(stream->stb_logFileCurrent, stream- >> >logFileCurrent); >> + stream->stb_logFileCurrent = stream- >> >logFileCurrent; >> stream = >> log_stream_getnext_by_name(stream->name); >> } >> TRACE_LEAVE(); >> @@ -2104,7 +2097,8 @@ static SaAisErrorT stream_create_and_con >> *stream = NULL; >> int i = 0; >> SaNameT objectName; >> - int n = 0; >> + std::string fileName; >> + std::string pathName; >> >> TRACE_ENTER(); >> >> @@ -2141,19 +2135,9 @@ static SaAisErrorT stream_create_and_con >> SaImmAttrValueT value = ccb- >> >param.create.attrValues[i]->attrValues[0]; >> >> if (!strcmp(ccb- >> >param.create.attrValues[i]->attrName, "saLogStreamFileName")) { >> - n = >> snprintf((*stream)->fileName, NAME_MAX, "%s", *((char **) value)); >> - if (n >= >> NAME_MAX) { >> - >> LOG_ER("Error: saLogStreamFileName > NAME_MAX"); >> - >> osafassert(0); >> - } >> - TRACE("fileName: >> %s", (*stream)->fileName); >> + fileName = >> *(static_cast<char **>(value)); >> } else if (!strcmp(ccb- >> >param.create.attrValues[i]->attrName, "saLogStreamPathName")) { >> - n = >> snprintf((*stream)->pathName, PATH_MAX, "%s", *((char **) value)); >> - if (n >= PATH_MAX) >> { >> - >> LOG_ER("Error: Path name size > PATH_MAX"); >> - >> osafassert(0); >> - } >> - TRACE("pathName: >> %s", (*stream)->pathName); >> + pathName = >> *(static_cast<char **>(value)); >> } else if (!strcmp(ccb- >> >param.create.attrValues[i]->attrName, "saLogStreamMaxLogFileSize")) { >> (*stream)- >> >maxLogFileSize = *((SaUint64T *) value); >> >> TRACE("maxLogFileSize: %llu", (*stream)->maxLogFileSize); >> @@ -2188,6 +2172,18 @@ static SaAisErrorT stream_create_and_con >> i++; >> } // while >> >> + /* Check if filename & pathName is valid */ >> + if (lgs_is_valid_filelength(fileName) && >> lgs_is_valid_pathlength(pathName, fileName)) { >> + (*stream)->fileName = fileName; >> + (*stream)->pathName = pathName; >> + TRACE("fileName: %s", fileName.c_str()); >> + TRACE("pathName: %s", pathName.c_str()); >> + } else { >> + TRACE("Problem with fileName (%s) or >> pathName (%s)", fileName.c_str(), pathName.c_str()); >> + rc = SA_AIS_ERR_NO_MEMORY; >> + goto done; >> + } >> + >> if ((*stream)->logFileFormat == NULL) { >> /* If passing NULL to log file format, use default >> value */ >> const char* logFileFormat = static_cast<const >> char *>(lgs_cfg_get(LGS_IMM_LOG_STREAM_FILE_FORMAT)); >> @@ -2226,11 +2222,10 @@ static void stream_ccb_apply_modify(cons >> const SaImmAttrModificationT_2 *attrMod; >> int i = 0; >> log_stream_t *stream; >> - char current_logfile_name[NAME_MAX]; >> + std::string current_logfile_name; >> bool new_cfg_file_needed = false; >> - int n = 0; >> struct timespec curtime_tspec; >> - char *fileName; >> + std::string fileName; >> bool modify = false; >> >> TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, opdata- >> >objectName.value); >> @@ -2238,11 +2233,7 @@ static void stream_ccb_apply_modify(cons >> stream = log_stream_get_by_name((char*)opdata- >> >objectName.value); >> osafassert(stream); >> >> - n = snprintf(current_logfile_name, NAME_MAX, "%s", stream- >> >logFileCurrent); >> - if (n >= NAME_MAX) { >> - LOG_ER("Error: a. File name > NAME_MAX"); >> - osafassert(0); >> - } >> + current_logfile_name = stream->logFileCurrent; >> >> attrMod = opdata->param.modify.attrMods[i++]; >> while (attrMod != NULL) { >> @@ -2295,7 +2286,7 @@ static void stream_ccb_apply_modify(cons >> >> osaf_clock_gettime(CLOCK_REALTIME, &curtime_tspec); >> time_t cur_time = curtime_tspec.tv_sec; >> - const char *root_path = static_cast<const char >> *>(lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> + std::string root_path = static_cast<const char >> *>(lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> >> if (new_cfg_file_needed) { >> int rc; >> @@ -2316,17 +2307,14 @@ static void stream_ccb_apply_modify(cons >> >> LOG_ER("log_stream_config_change failed: %d", rc); >> } >> >> - n = snprintf(stream->fileName, NAME_MAX, >> "%s", fileName); >> - if (n >= NAME_MAX) { >> - LOG_ER("Error: File name (%zu) > >> NAME_MAX (%d)", strlen(fileName), (int) NAME_MAX); >> - osafassert(0); >> - } >> + stream->fileName = fileName; >> + >> if ((rc = lgs_create_config_file_h(root_path, >> stream)) != 0) { >> >> LOG_ER("lgs_create_config_file_h failed: %d", rc); >> } >> >> char *current_time = lgs_get_time(&cur_time); >> - sprintf(stream->logFileCurrent, "%s_%s", >> stream->fileName, current_time); >> + stream->logFileCurrent = stream->fileName + >> "_" + current_time; >> >> // Create the new log file based on updated >> configuration >> *stream->p_fd = log_file_open(root_path, >> @@ -2579,11 +2567,11 @@ static SaAisErrorT stream_create_and_con >> value = attribute->attrValues[0]; >> >> if (!strcmp(attribute->attrName, >> "saLogStreamFileName")) { >> - strcpy(stream->fileName, *((char >> **)value)); >> - TRACE("fileName: %s", stream- >> >fileName); >> + stream->fileName = >> *(static_cast<char **>(value)); >> + TRACE("fileName: %s", stream- >> >fileName.c_str()); >> } else if (!strcmp(attribute->attrName, >> "saLogStreamPathName")) { >> - strcpy(stream->pathName, >> *((char **)value)); >> - TRACE("pathName: %s", stream- >> >pathName); >> + stream->pathName = >> *(static_cast<char **>(value)); >> + TRACE("pathName: %s", stream- >> >pathName.c_str()); >> } else if (!strcmp(attribute->attrName, >> "saLogStreamMaxLogFileSize")) { >> stream->maxLogFileSize = >> *((SaUint64T *)value); >> TRACE("maxLogFileSize: %llu", >> stream->maxLogFileSize); >> @@ -2621,6 +2609,14 @@ static SaAisErrorT stream_create_and_con >> } >> } >> >> + /* Check if the fileName and pathName are valid */ >> + if ((lgs_is_valid_filelength(stream->fileName) == false) || >> + (lgs_is_valid_pathlength(stream->pathName, >> stream->fileName) == false)) { >> + LOG_ER("Problem with fileName >> (%s)/pathName (%s)", >> + stream->fileName.c_str(), >> stream->pathName.c_str()); >> + osafassert(0); >> + } >> + >> if (stream->logFileFormat == NULL) { >> if (stream->streamType == >> STREAM_TYPE_APPLICATION) { >> const char* logFileFormat = >> static_cast<const char *>( >> diff --git a/osaf/services/saf/logsv/lgs/lgs_mbcsv.cc >> b/osaf/services/saf/logsv/lgs/lgs_mbcsv.cc >> --- a/osaf/services/saf/logsv/lgs/lgs_mbcsv.cc >> +++ b/osaf/services/saf/logsv/lgs/lgs_mbcsv.cc >> @@ -291,12 +291,12 @@ uint32_t lgs_mbcsv_change_HA_state(lgs_c >> stream = log_stream_getnext_by_name(NULL); >> while (stream != NULL) { /* Iterate over all >> streams */ >> if (cb->ha_state == >> SA_AMF_HA_ACTIVE) { >> - strcpy(stream- >> >logFileCurrent, stream->stb_logFileCurrent); >> + stream- >> >logFileCurrent = stream->stb_logFileCurrent; >> stream->curFileSize >> = stream->stb_curFileSize; >> *stream->p_fd = - >> 1; /* Reopen files */ >> } else if (cb->ha_state == >> SA_AMF_HA_QUIESCED) { >> - strcpy(stream- >> >stb_logFileCurrent, stream->logFileCurrent); >> - strcpy(stream- >> >stb_prev_actlogFileCurrent, stream->stb_logFileCurrent); >> + stream- >> >stb_logFileCurrent = stream->logFileCurrent; >> + stream- >> >stb_prev_actlogFileCurrent = stream->stb_logFileCurrent; >> stream- >> >stb_curFileSize = stream->curFileSize; >> *stream->p_fd = - >> 1; /* Reopen files */ >> } >> @@ -593,9 +593,9 @@ uint32_t lgs_ckpt_stream_open_set(log_st >> memset(stream_open, 0, sizeof(lgs_ckpt_stream_open_t)); >> stream_open->clientId = -1; /* not used in this message */ >> stream_open->streamId = logStream->streamId; >> - stream_open->logFile = logStream->fileName; >> - stream_open->logPath = logStream->pathName; >> - stream_open->logFileCurrent = logStream->logFileCurrent; >> + stream_open->logFile = const_cast<char *>(logStream- >> >fileName.c_str()); >> + stream_open->logPath = const_cast<char *>(logStream- >> >pathName.c_str()); >> + stream_open->logFileCurrent = const_cast<char >> *>(logStream->logFileCurrent.c_str()); >> stream_open->fileFmt = logStream->logFileFormat; >> stream_open->logStreamName = logStream->name; >> stream_open->maxFileSize = logStream->maxLogFileSize; >> @@ -1724,8 +1724,8 @@ static uint32_t ckpt_proc_log_write(lgs_ >> >> stream->logRecordId = recordId; >> stream->curFileSize = curFileSize; >> - strcpy(stream->logFileCurrent, logFileCurrent); >> - >> + stream->logFileCurrent = logFileCurrent; >> + >> /* If configured for split file system log records shall be written >> also if >> * we are standby. >> */ >> @@ -1912,10 +1912,10 @@ uint32_t ckpt_proc_open_stream(lgs_cb_t >> >> stream->numOpeners = param->numOpeners; >> stream->creationTimeStamp = param- >> >creationTimeStamp; >> - strcpy(stream->logFileCurrent, param- >> >logFileCurrent); >> stream->stb_curFileSize = 0; >> - strcpy(stream->stb_prev_actlogFileCurrent, >> param->logFileCurrent); >> - strcpy(stream->stb_logFileCurrent, param- >> >logFileCurrent); >> + stream->logFileCurrent = param- >> >logFileCurrent; >> + stream->stb_prev_actlogFileCurrent = param- >> >logFileCurrent; >> + stream->stb_logFileCurrent = param- >> >logFileCurrent; >> } >> >> /* If configured for split file system files shall be opened on >> stand by >> @@ -2112,7 +2112,7 @@ static uint32_t ckpt_proc_cfg_stream(lgs >> >> TRACE("config stream %s, id: %u", stream->name, stream- >> >streamId); >> stream->act_last_close_timestamp = closetime; /* Not used if >> ver 1 */ >> - strcpy(stream->fileName, fileName); >> + stream->fileName = fileName; >> stream->maxLogFileSize = maxLogFileSize; >> stream->fixedLogRecordSize = fixedLogRecordSize; >> stream->logFullAction = logFullAction; >> @@ -2126,12 +2126,12 @@ static uint32_t ckpt_proc_cfg_stream(lgs >> >> strcpy(stream->logFileFormat, logFileFormat); >> stream->severityFilter = severityFilter; >> - strcpy(stream->logFileCurrent, logFileCurrent); >> + stream->logFileCurrent = logFileCurrent; >> >> /* If split file mode, update standby files */ >> if (lgs_is_split_file_system()) { >> int rc = 0; >> - const char *root_path = static_cast<const char >> *>(lgs_cfg_get( >> + std::string root_path = static_cast<const char >> *>(lgs_cfg_get( >> >> LGS_IMM_LOG_ROOT_DIRECTORY)); >> if ((rc = >> log_stream_config_change(LGS_STREAM_CREATE_FILES, >> root_path, stream, >> @@ -2142,8 +2142,8 @@ static uint32_t ckpt_proc_cfg_stream(lgs >> /* When modifying old files are closed and new >> are opened meaning that >> * we have a new standby current log-file >> */ >> - strcpy(stream->stb_prev_actlogFileCurrent, >> stream->logFileCurrent); >> - strcpy(stream->stb_logFileCurrent, stream- >> >logFileCurrent); >> + stream->stb_prev_actlogFileCurrent = stream- >> >logFileCurrent; >> + stream->stb_logFileCurrent = stream- >> >logFileCurrent; >> } >> >> done: >> diff --git a/osaf/services/saf/logsv/lgs/lgs_mbcsv_v2.cc >> b/osaf/services/saf/logsv/lgs/lgs_mbcsv_v2.cc >> --- a/osaf/services/saf/logsv/lgs/lgs_mbcsv_v2.cc >> +++ b/osaf/services/saf/logsv/lgs/lgs_mbcsv_v2.cc >> @@ -57,8 +57,9 @@ uint32_t ckpt_proc_lgs_cfg_v2(lgs_cb_t * >> >> /* Handle log files for new directory if configured for split file >> system */ >> if (lgs_is_split_file_system()) { >> - const char *old_root = static_cast<const char >> *>(lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> - const char *new_root = param- >> >logRootDirectory; >> + const std::string old_root = static_cast<const >> char *>( >> + >> lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> + const std::string new_root = param- >> >logRootDirectory; >> /* Change root path in configuration struct */ >> lgs_rootpathconf_set(param- >> >logRootDirectory); >> logRootDirectory_filemove(new_root, old_root, >> diff --git a/osaf/services/saf/logsv/lgs/lgs_mds.cc >> b/osaf/services/saf/logsv/lgs/lgs_mds.cc >> --- a/osaf/services/saf/logsv/lgs/lgs_mds.cc >> +++ b/osaf/services/saf/logsv/lgs/lgs_mds.cc >> @@ -130,6 +130,12 @@ static uint32_t dec_lstr_open_sync_msg(N >> lgsv_stream_open_req_t *param = &msg- >> >info.api_info.param.lstr_open_sync; >> uint8_t local_data[256]; >> >> + TRACE_ENTER(); >> + // To make it safe when using free() >> + param->logFileName = NULL; >> + param->logFilePathName = NULL; >> + param->logFileFmt = NULL; >> + >> /* client_id */ >> p8 = ncs_dec_flatten_space(uba, local_data, 4); >> param->client_id = ncs_decode_32bit(&p8); >> @@ -154,26 +160,48 @@ static uint32_t dec_lstr_open_sync_msg(N >> len = ncs_decode_16bit(&p8); >> ncs_dec_skip_space(uba, 2); >> >> - if ((len == 0) || (len > NAME_MAX)) { >> - TRACE("%s - logFileName length is invalid >> (%d)",__FUNCTION__, len); >> - rc = NCSCC_RC_FAILURE; >> - goto done; >> + TRACE("enter dealing with logfilename"); >> + /** >> + * Leave the upper limit check to lgs_evt. >> + * Then, if the file length is invalid, LOG agent will get >> INVALID_PARAM >> + * instead of error code RC_FAILURE returned by MDS layer. >> + */ >> + if (len > 0) { >> + /** >> + * This allocated memory is freed in >> proc_stream_open_msg() @ lgs_evt.c >> + */ >> + param->logFileName = static_cast<char >> *>(malloc(len)); >> + if (param->logFileName == NULL) { >> + LOG_ER("%s - Failed to allocate >> memory for logFileName", __FUNCTION__); >> + rc = NCSCC_RC_FAILURE; >> + goto done_err; >> + } >> + ncs_decode_n_octets_from_uba(uba, (uint8_t >> *)param->logFileName, len); >> } >> >> - ncs_decode_n_octets_from_uba(uba, (uint8_t *)param- >> >logFileName, len); >> - >> /* log file path name */ >> p8 = ncs_dec_flatten_space(uba, local_data, 2); >> len = ncs_decode_16bit(&p8); >> ncs_dec_skip_space(uba, 2); >> >> - if ((len == 0) || (len > PATH_MAX)) { >> - TRACE("%s - logFilePathName length is invalid >> (%d)",__FUNCTION__, len); >> + if (len > PATH_MAX) { >> + TRACE("%s - logFilePathName length is invalid >> (%d)", __FUNCTION__, len); >> rc = NCSCC_RC_FAILURE; >> - goto done; >> + goto done_err; >> } >> >> - ncs_decode_n_octets_from_uba(uba, (uint8_t *)param- >> >logFilePathName, len); >> + if (len > 0) { >> + /** >> + * This allocated memory is freed in >> proc_stream_open_msg() @ lgs_evt.c >> + */ >> + param->logFilePathName = static_cast<char >> *>(malloc(len)); >> + if (param->logFilePathName == NULL) { >> + LOG_ER("%s - Failed to allocate >> memory for logFilePathName", __FUNCTION__); >> + rc = NCSCC_RC_FAILURE; >> + goto done_err; >> + } >> + ncs_decode_n_octets_from_uba(uba, (uint8_t >> *)param->logFilePathName, len); >> + } >> >> /* log record format length */ >> p8 = ncs_dec_flatten_space(uba, local_data, 24); >> @@ -191,7 +219,7 @@ static uint32_t dec_lstr_open_sync_msg(N >> if (param->logFileFmt == NULL) { >> LOG_WA("malloc FAILED"); >> rc = NCSCC_RC_FAILURE; >> - goto done; >> + goto done_err; >> } >> ncs_decode_n_octets_from_uba(uba, (uint8_t >> *)param->logFileFmt, len); >> } >> @@ -201,7 +229,15 @@ static uint32_t dec_lstr_open_sync_msg(N >> param->lstr_open_flags = ncs_decode_8bit(&p8); >> ncs_dec_skip_space(uba, 1); >> >> - done: >> + // Everything is ok. Do not free the allocated memories. >> + goto done; >> + >> +done_err: >> + free(param->logFileName); >> + free(param->logFilePathName); >> + free(param->logFileFmt); >> + >> +done: >> TRACE_8("LGSV_STREAM_OPEN_REQ"); >> return rc; >> } >> diff --git a/osaf/services/saf/logsv/lgs/lgs_stream.cc >> b/osaf/services/saf/logsv/lgs/lgs_stream.cc >> --- a/osaf/services/saf/logsv/lgs/lgs_stream.cc >> +++ b/osaf/services/saf/logsv/lgs/lgs_stream.cc >> @@ -58,31 +58,27 @@ static int get_number_of_log_files_h(log >> * @param errno_save[out], errno if error >> * @return File descriptor or -1 if error >> */ >> -static int fileopen_h(char *filepath, int *errno_save) >> +static int fileopen_h(const std::string &filepath, int *errno_save) >> { >> lgsf_apipar_t apipar; >> lgsf_retcode_t api_rc; >> int fd; >> fopen_in_t data_in; >> const char *groupname = NULL; >> - >> + std::string filePath; >> + >> TRACE_ENTER(); >> - >> - osafassert(filepath != NULL); >> - >> - if ((strlen(filepath)+1) > PATH_MAX) { >> - LOG_WA("Cannot open file, File path > >> PATH_MAX"); >> - fd = -1; >> - goto done; >> - } >> + >> + osafassert(filepath.empty() != true); >> >> groupname = static_cast<const char >> *>(lgs_cfg_get(LGS_IMM_DATA_GROUPNAME)); >> >> - strcpy(data_in.filepath, filepath); >> + filePath = filepath; >> + data_in.filepath = const_cast<char *>(filePath.c_str()); >> strcpy(data_in.groupname, groupname); >> - >> - TRACE("%s - filepath \"%s\"",__FUNCTION__,filepath); >> - >> + >> + TRACE("%s - filepath \"%s\"",__FUNCTION__, >> filepath.c_str()); >> + >> /* Fill in API structure */ >> apipar.req_code_in = LGSF_FILEOPEN; >> apipar.data_in_size = sizeof(fopen_in_t); >> @@ -97,8 +93,7 @@ static int fileopen_h(char *filepath, in >> } else { >> fd = apipar.hdl_ret_code_out; >> } >> - >> -done: >> + >> TRACE_LEAVE(); >> return fd; >> } >> @@ -155,7 +150,7 @@ static int fileclose_h(int fd, int *errn >> * be deleted >> * @return (-1) if error >> */ >> -static int file_unlink_h(char *filepath) >> +static int file_unlink_h(const std::string &filepath) >> { >> int rc = 0; >> lgsf_apipar_t apipar; >> @@ -163,17 +158,13 @@ static int file_unlink_h(char *filepath) >> size_t filepath_len; >> >> TRACE_ENTER(); >> - filepath_len = strlen(filepath)+1; /* Include terminating null >> character */ >> - if (filepath_len > PATH_MAX) { >> - LOG_WA("Cannot delete file, File path > >> PATH_MAX"); >> - rc = -1; >> - goto done; >> - } >> - >> + >> + filepath_len = filepath.size() + 1; /* Include terminating null >> character */ >> + >> /* Fill in API structure */ >> apipar.req_code_in = LGSF_DELETE_FILE; >> apipar.data_in_size = filepath_len; >> - apipar.data_in = filepath; >> + apipar.data_in = const_cast<char *>(filepath.c_str()); >> apipar.data_out_size = 0; >> apipar.data_out = NULL; >> >> @@ -185,7 +176,6 @@ static int file_unlink_h(char *filepath) >> rc = apipar.hdl_ret_code_out; >> } >> >> -done: >> TRACE_LEAVE2("rc = %d", rc); >> return rc; >> >> @@ -200,26 +190,19 @@ done: >> static int delete_config_file(log_stream_t *stream) >> { >> int rc = 0; >> - int n; >> - char pathname[PATH_MAX]; >> + std::string pathname; >> >> TRACE_ENTER(); >> >> /* create absolute path for config file */ >> - const char *logsv_root_dir = static_cast<const char *>( >> + std::string logsv_root_dir = static_cast<const char *>( >> >> lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> >> - n = snprintf(pathname, PATH_MAX, "%s/%s/%s.cfg", >> - logsv_root_dir, stream->pathName, stream- >> >fileName); >> - if (n >= PATH_MAX) { >> - LOG_WA("Config file could not be deleted, path >> > PATH_MAX"); >> - rc = -1; >> - goto done; >> - } >> + pathname = logsv_root_dir + "/" + stream->pathName + >> + "/" + stream->fileName + ".cfg"; >> >> rc = file_unlink_h(pathname); >> - >> -done: >> + >> TRACE_LEAVE2("rc = %d", rc); >> return rc; >> } >> @@ -315,8 +298,9 @@ static uint32_t log_stream_remove(const >> void log_initiate_stream_files(log_stream_t *stream) >> { >> int errno_save; >> - const char *log_root_path = static_cast<const char >> *>(lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> - >> + const std::string log_root_path = static_cast<const char *>( >> + >> lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> + >> TRACE_ENTER(); >> >> /* Initiate standby stream file parameters. Only needed if we >> are standby >> @@ -324,8 +308,7 @@ void log_initiate_stream_files(log_strea >> */ >> if ((lgs_cb->ha_state == SA_AMF_HA_STANDBY) && >> lgs_is_split_file_system()) { >> stream->stb_curFileSize = 0; >> - strncpy(stream->stb_logFileCurrent, stream- >> >logFileCurrent, NAME_MAX); >> - stream->stb_logFileCurrent[NAME_MAX-1] = 0; >> + stream->stb_logFileCurrent = stream- >> >logFileCurrent; >> } >> >> /* Initiate stream file descriptor to flag that no valid descriptor >> exist */ >> @@ -353,8 +336,8 @@ void log_initiate_stream_files(log_strea >> if ((*stream->p_fd = log_file_open(log_root_path, stream, >> stream->logFileCurrent, >> &errno_save)) == -1) { >> - TRACE("%s - Could not open '%s' - >> %s",__FUNCTION__, >> - stream- >> >logFileCurrent, strerror(errno_save)); >> + TRACE("%s - Could not open '%s' - %s", >> __FUNCTION__, >> + stream- >> >logFileCurrent.c_str(), strerror(errno_save)); >> goto done; >> } >> >> @@ -391,8 +374,8 @@ void log_stream_print(log_stream_t *stre >> osafassert(stream != NULL); >> >> TRACE_2("******** Stream %s ********", stream->name); >> - TRACE_2(" fileName: %s", stream->fileName); >> - TRACE_2(" pathName: %s", stream->pathName); >> + TRACE_2(" fileName: %s", stream->fileName.c_str()); >> + TRACE_2(" pathName: %s", stream->pathName.c_str()); >> TRACE_2(" maxLogFileSize: %llu", stream->maxLogFileSize); >> TRACE_2(" fixedLogRecordSize: %u", stream- >> >fixedLogRecordSize); >> if (stream->streamType == STREAM_TYPE_APPLICATION) >> @@ -406,7 +389,7 @@ void log_stream_print(log_stream_t *stre >> TRACE_2(" numOpeners: %u", stream->numOpeners); >> TRACE_2(" streamId: %u", stream->streamId); >> TRACE_2(" fd: %d", *stream->p_fd); >> - TRACE_2(" logFileCurrent: %s", stream->logFileCurrent); >> + TRACE_2(" logFileCurrent: %s", stream- >> >logFileCurrent.c_str()); >> TRACE_2(" curFileSize: %u", stream->curFileSize); >> TRACE_2(" logRecordId: %u", stream->logRecordId); >> TRACE_2(" streamType: %u", stream->streamType); >> @@ -447,7 +430,7 @@ void log_stream_delete(log_stream_t **s) >> if (stream->logFileFormat != NULL) >> free(stream->logFileFormat); >> >> - free(stream); >> + delete stream; >> *s = NULL; >> TRACE_LEAVE(); >> } >> @@ -489,8 +472,8 @@ static void init_log_stream_fd(log_strea >> * @return log_stream_t* >> */ >> log_stream_t *log_stream_new(SaNameT *dn, >> - const char *filename, >> - const char *pathname, >> + const std::string >> &filename, >> + const std::string >> &pathname, >> SaUint64T maxLogFileSize, >> SaUint32T fixedLogRecordSize, >> SaLogFileFullActionT >> logFullAction, >> @@ -509,15 +492,16 @@ log_stream_t *log_stream_new(SaNameT *dn >> if (lgs_relative_path_check_ts(pathname)) { >> goto done; >> } >> - stream = static_cast<log_stream_t *>(calloc(1, >> sizeof(log_stream_t))); >> + >> + stream = new (std::nothrow) log_stream_t(); >> if (stream == NULL) { >> LOG_WA("log_stream_new calloc FAILED"); >> goto done; >> } >> memcpy(stream->name, dn->value, dn->length); >> stream->name[SA_MAX_NAME_LENGTH] = '\0'; >> - strncpy(stream->fileName, filename, sizeof(stream- >> >fileName)); >> - strncpy(stream->pathName, pathname, sizeof(stream- >> >pathName)); >> + stream->fileName = filename; >> + stream->pathName = pathname; >> stream->maxLogFileSize = maxLogFileSize; >> stream->fixedLogRecordSize = fixedLogRecordSize; >> stream->haProperty = SA_TRUE; >> @@ -582,7 +566,7 @@ log_stream_t *log_stream_new(SaNameT *dn >> .attrValuesNumber = 1, >> .attrValues = arr1 >> }; >> - char *str2 = stream->fileName; >> + char *str2 = const_cast<char *>(stream- >> >fileName.c_str()); >> void *arr2[] = { &str2 }; >> const SaImmAttrValuesT_2 >> attr_safLogStreamFileName = { >> .attrName = >> const_cast<SaImmAttrNameT>("saLogStreamFileName"), >> @@ -590,7 +574,7 @@ log_stream_t *log_stream_new(SaNameT *dn >> .attrValuesNumber = 1, >> .attrValues = arr2 >> }; >> - char *str3 = stream->pathName; >> + char *str3 = const_cast<char *>(stream- >> >pathName.c_str()); >> void *arr3[] = { &str3 }; >> const SaImmAttrValuesT_2 >> attr_safLogStreamPathName = { >> .attrName = >> const_cast<SaImmAttrNameT>("saLogStreamPathName"), >> @@ -707,7 +691,7 @@ log_stream_t *log_stream_new_2(SaNameT * >> osafassert(name != NULL); >> TRACE_ENTER2("%s, l: %u", name->value, (unsigned int)name- >> >length); >> >> - stream = static_cast<log_stream_t *>(calloc(1, >> sizeof(log_stream_t))); >> + stream = new (std::nothrow) (log_stream_t)(); >> if (stream == NULL) { >> LOG_WA("calloc FAILED"); >> goto done; >> @@ -760,33 +744,26 @@ log_stream_t *log_stream_new_2(SaNameT * >> * @return int - the file descriptor or -1 on errors >> */ >> int log_file_open( >> - const char *root_path, >> - log_stream_t *stream, >> - const char* filename, >> - int *errno_save) >> + const std::string &root_path, >> + log_stream_t *stream, >> + const std::string &filename, >> + int *errno_save) >> { >> int fd; >> - char pathname[PATH_MAX]; >> + std::string pathname; >> int errno_ret; >> - int n; >> >> TRACE_ENTER(); >> >> - n = snprintf(pathname, PATH_MAX, "%s/%s/%s.log", >> - root_path, stream->pathName, >> filename); >> - if (n >= PATH_MAX) { >> - LOG_WA("Cannot open log file, path > >> PATH_MAX"); >> - fd = -1; >> - goto done; >> - } >> - >> - TRACE("%s - Opening file \"%s\"",__FUNCTION__,pathname); >> + pathname = root_path + "/" + stream->pathName + "/" + >> filename + ".log"; >> + >> + TRACE("%s - Opening file \"%s\"", __FUNCTION__, >> pathname.c_str()); >> + >> fd = fileopen_h(pathname, &errno_ret); >> if (errno_save != 0) { >> *errno_save = errno_ret; >> } >> >> -done: >> TRACE_LEAVE(); >> return fd; >> } >> @@ -814,7 +791,7 @@ void log_stream_open_fileinit(log_stream >> /* first time open? */ >> if (stream->numOpeners == 0) { >> /* Create and save current log file name */ >> - snprintf(stream->logFileCurrent, NAME_MAX, >> "%s_%s", stream->fileName, lgs_get_time(NULL)); >> + stream->logFileCurrent = stream->fileName + >> "_" + lgs_get_time(NULL); >> log_initiate_stream_files(stream); >> } >> >> @@ -844,14 +821,16 @@ void log_stream_close(log_stream_t **s, >> int rc = 0; >> int errno_ret; >> log_stream_t *stream = *s; >> - char *file_to_rename = NULL; >> + std::string file_to_rename; >> char *timeString = NULL; >> + std::string emptyStr = ""; >> uint32_t msecs_waited = 0; >> const unsigned int max_waiting_time = 8 * 1000; /* 8 >> secs */ >> const unsigned int sleep_delay_ms = 500; >> SaUint32T trace_num_openers; >> struct timespec closetime_tspec; >> - const char *root_path = static_cast<const char >> *>(lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> + const std::string root_path = static_cast<const char *>( >> + >> lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> >> osafassert(stream != NULL); >> TRACE_ENTER2("%s", stream->name); >> @@ -899,14 +878,15 @@ void log_stream_close(log_stream_t **s, >> /* Rename stream log file */ >> rc = >> lgs_file_rename_h(root_path, stream->pathName, >> >> file_to_rename, timeString, >> - >> LGS_LOG_FILE_EXT, NULL); >> + >> LGS_LOG_FILE_EXT, emptyStr); >> while ((rc == -1) && >> (msecs_waited < max_waiting_time)) { >> >> usleep(sleep_delay_ms * 1000); >> msecs_waited += >> sleep_delay_ms; >> rc = >> lgs_file_rename_h(root_path, stream->pathName, >> >> file_to_rename, timeString, >> - >> LGS_LOG_FILE_EXT, NULL); >> + >> LGS_LOG_FILE_EXT, emptyStr); >> } >> + >> if (rc == -1) { >> LOG_ER("Could not >> rename log file: %s", strerror(errno)); >> goto done_files; >> @@ -915,13 +895,13 @@ void log_stream_close(log_stream_t **s, >> /* Rename stream config file */ >> rc = >> lgs_file_rename_h(root_path, stream->pathName, >> >> stream->fileName, timeString, >> - >> LGS_LOG_FILE_CONFIG_EXT, NULL); >> + >> LGS_LOG_FILE_CONFIG_EXT, emptyStr); >> while ((rc == -1) && >> (msecs_waited < max_waiting_time)) { >> >> usleep(sleep_delay_ms * 1000); >> msecs_waited += >> sleep_delay_ms; >> rc = >> lgs_file_rename_h(root_path, stream->pathName, >> >> stream->fileName, timeString, >> - >> LGS_LOG_FILE_CONFIG_EXT, NULL); >> + >> LGS_LOG_FILE_CONFIG_EXT, emptyStr); >> } >> if (rc == -1) { >> LOG_ER("Could not >> rename config file: %s", strerror(errno)); >> @@ -977,42 +957,17 @@ static int get_number_of_log_files_h(log >> lgsf_apipar_t apipar; >> lgsf_retcode_t api_rc; >> gnolfh_in_t parameters_in; >> - size_t path_len; >> - int rc, n; >> - >> + int rc = 0; >> + >> TRACE_ENTER(); >> >> - const char *logsv_root_dir = static_cast<const char >> *>(lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> + std::string logsv_root_dir = static_cast<const char *>( >> + >> lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> >> - n = snprintf(parameters_in.file_name, >> SA_MAX_NAME_LENGTH, "%s", logStream->fileName); >> - if (n >= SA_MAX_NAME_LENGTH) { >> - rc = -1; >> - LOG_WA("file_name > >> SA_MAX_NAME_LENGTH"); >> - goto done; >> - } >> + parameters_in.file_name = const_cast<char *>(logStream- >> >fileName.c_str()); >> + parameters_in.logsv_root_dir = const_cast<char >> *>(logsv_root_dir.c_str()); >> + parameters_in.pathName = const_cast<char *>(logStream- >> >pathName.c_str()); >> >> - n = snprintf(parameters_in.logsv_root_dir, PATH_MAX, "%s", >> logsv_root_dir); >> - if (n >= PATH_MAX) { >> - rc = -1; >> - LOG_WA("logsv_root_dir > PATH_MAX"); >> - goto done; >> - } >> - n = snprintf(parameters_in.pathName, PATH_MAX, "%s", >> logStream->pathName); >> - if (n >= PATH_MAX) { >> - rc = -1; >> - LOG_WA("pathName > PATH_MAX"); >> - goto done; >> - } >> - >> - path_len = strlen(parameters_in.file_name) + >> - >> strlen(parameters_in.logsv_root_dir) + >> - >> strlen(parameters_in.pathName); >> - if (path_len > PATH_MAX) { >> - LOG_WA("Path to log files > PATH_MAX"); >> - rc = -1; >> - goto done; >> - } >> - >> /* Fill in API structure */ >> apipar.req_code_in = LGSF_GET_NUM_LOGFILES; >> apipar.data_in_size = sizeof(gnolfh_in_t); >> @@ -1028,7 +983,6 @@ static int get_number_of_log_files_h(log >> rc = apipar.hdl_ret_code_out; >> } >> >> -done: >> TRACE_LEAVE(); >> return rc; >> } >> @@ -1047,10 +1001,10 @@ static int log_rotation_stb(log_stream_t >> int errno_save; >> int errno_ret; >> char *current_time_str; >> - char new_current_log_filename[NAME_MAX]; >> + std::string new_current_log_filename; >> bool do_rotate = false; >> - const char *root_path = static_cast<const char >> *>(lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> - >> + std::string root_path = static_cast<const char >> *>(lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> + >> TRACE_ENTER(); >> >> stream->stb_curFileSize += count; >> @@ -1069,17 +1023,17 @@ static int log_rotation_stb(log_stream_t >> * This means that a rotation on active when standby is running >> is not >> * guaranteed. This situation though is very unlikely. >> */ >> - if (strcmp(stream->logFileCurrent, stream- >> >stb_prev_actlogFileCurrent) != 0) { >> + if (stream->logFileCurrent != stream- >> >stb_prev_actlogFileCurrent) { >> TRACE("Active has rotated (follow active)"); >> /* Active has rotated */ >> - strcpy(stream->stb_prev_actlogFileCurrent, >> stream->logFileCurrent); >> + stream->stb_prev_actlogFileCurrent = stream- >> >logFileCurrent; >> /* Use close time from active for renaming of >> closed file >> */ >> >> current_time_str = lgs_get_time(&stream- >> >act_last_close_timestamp); >> do_rotate = true; >> /* Use same name as active for new current log >> file */ >> - snprintf(new_current_log_filename, >> NAME_MAX, "%s", stream->logFileCurrent); >> + new_current_log_filename = stream- >> >logFileCurrent; >> } else if (stream->stb_curFileSize > stream->maxLogFileSize) { >> TRACE("Standby has rotated (filesize)"); >> /* Standby current log file has reached max limit >> */ >> @@ -1087,8 +1041,7 @@ static int log_rotation_stb(log_stream_t >> current_time_str = lgs_get_time(NULL); >> do_rotate = true; >> /* Create new name for current log file based >> on local time */ >> - snprintf(new_current_log_filename, >> NAME_MAX, "%s_%s", >> - stream->fileName, >> current_time_str); >> + new_current_log_filename = stream->fileName >> + "_" + current_time_str; >> } >> >> if (do_rotate) { >> @@ -1103,11 +1056,15 @@ static int log_rotation_stb(log_stream_t >> LOG_NO("close FAILED: %s", >> strerror(errno_ret)); >> goto done; >> } >> - >> + >> + std::string emptyStr = ""; >> /* Rename file to give it the "close timestamp" >> */ >> rc = lgs_file_rename_h(root_path, >> - stream->pathName, stream- >> >stb_logFileCurrent, >> - current_time_str, >> LGS_LOG_FILE_EXT, NULL); >> + stream- >> >pathName, >> + stream- >> >stb_logFileCurrent, >> + >> current_time_str, >> + >> LGS_LOG_FILE_EXT, >> + emptyStr); >> if (rc == -1) >> goto done; >> >> @@ -1117,11 +1074,12 @@ static int log_rotation_stb(log_stream_t >> } >> >> /* Save new name for current log file and open >> it */ >> - snprintf(stream->stb_logFileCurrent, >> NAME_MAX, "%s", new_current_log_filename); >> + stream->stb_logFileCurrent = >> new_current_log_filename; >> if ((*stream->p_fd = log_file_open(root_path, >> stream, >> - stream->stb_logFileCurrent, >> &errno_save)) == -1) { >> - LOG_IN("Could not open '%s' - >> %s", stream->stb_logFileCurrent, >> - >> strerror(errno_save)); >> + >> stream->stb_logFileCurrent, >> + >> &errno_save)) == -1) { >> + LOG_IN("Could not open '%s' - >> %s", stream->stb_logFileCurrent.c_str(), >> + strerror(errno_save)); >> rc = -1; >> goto done; >> } >> @@ -1147,8 +1105,10 @@ static int log_rotation_act(log_stream_t >> int errno_save; >> int errno_ret; >> struct timespec closetime_tspec; >> - const char *root_path = static_cast<const char >> *>(lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> - >> + std::string root_path = static_cast<const char *>( >> + >> lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> + std::string emptyStr = ""; >> + >> /* If file size > max file size: >> * - Close the log file and create a new. >> * - If number of files > max number of files delete the oldest >> @@ -1170,9 +1130,12 @@ static int log_rotation_act(log_stream_t >> } >> >> /* Rename file to give it the "close timestamp" >> */ >> - rc = lgs_file_rename_h(root_path, stream- >> >pathName, >> - stream->logFileCurrent, >> current_time, >> - LGS_LOG_FILE_EXT, NULL); >> + rc = lgs_file_rename_h(root_path, >> + stream- >> >pathName, >> + stream- >> >logFileCurrent, >> + current_time, >> + >> LGS_LOG_FILE_EXT, >> + emptyStr); >> if (rc == -1) >> goto done; >> >> @@ -1191,12 +1154,13 @@ static int log_rotation_act(log_stream_t >> } >> >> /* Create a new file name that includes "open >> time stamp" and open the file */ >> - snprintf(stream->logFileCurrent, NAME_MAX, >> "%s_%s", stream->fileName, >> - current_time); >> - if ((*stream->p_fd = log_file_open(root_path, >> stream, >> - stream->logFileCurrent, >> &errno_save)) == -1) { >> - LOG_IN("Could not open '%s' - >> %s", stream->logFileCurrent, >> - >> strerror(errno_save)); >> + stream->logFileCurrent = stream->fileName + >> "_" + current_time; >> + if ((*stream->p_fd = log_file_open(root_path, >> + >> stream, >> + >> stream->logFileCurrent, >> + >> &errno_save)) == -1) { >> + LOG_IN("Could not open '%s' - >> %s", stream->logFileCurrent.c_str(), >> + strerror(errno_save)); >> rc = -1; >> goto done; >> } >> @@ -1291,9 +1255,9 @@ int log_stream_write_h(log_stream_t *str >> */ >> /* Careful with log level here to avoid syslog >> flooding */ >> if (rc == -2) { >> - LOG_IN("write '%s' failed >> \"Timeout\"", stream->logFileCurrent); >> + LOG_IN("write '%s' failed >> \"Timeout\"", stream->logFileCurrent.c_str()); >> } else { >> - LOG_IN("write '%s' failed \"%s\"", >> stream->logFileCurrent, >> + LOG_IN("write '%s' failed \"%s\"", >> stream->logFileCurrent.c_str(), >> >> strerror(write_errno)); >> } >> >> @@ -1485,14 +1449,15 @@ uint32_t log_stream_init() >> * @return -1 on error >> */ >> int log_stream_config_change(bool create_files_f, >> - const char *root_path, >> + const std::string &root_path, >> log_stream_t *stream, >> - const char >> *current_logfile_name, >> + const std::string >> ¤t_logfile_name, >> time_t *cur_time_in) >> { >> int rc; >> int errno_ret; >> char *current_time = lgs_get_time(cur_time_in); >> + std::string emptyStr = ""; >> >> TRACE_ENTER2("%s", stream->name); >> >> @@ -1513,13 +1478,13 @@ int log_stream_config_change(bool create >> *stream->p_fd = -1; >> >> rc = lgs_file_rename_h(root_path, stream- >> >pathName, current_logfile_name, >> - current_time, >> LGS_LOG_FILE_EXT, NULL); >> + current_time, >> LGS_LOG_FILE_EXT, emptyStr); >> if (rc == -1) { >> goto done; >> } >> >> rc = lgs_file_rename_h(root_path, stream- >> >pathName, stream->fileName, >> - current_time, >> LGS_LOG_FILE_CONFIG_EXT, NULL); >> + current_time, >> LGS_LOG_FILE_CONFIG_EXT, emptyStr); >> if (rc == -1) { >> goto done; >> } >> @@ -1530,11 +1495,13 @@ int log_stream_config_change(bool create >> if ((rc = lgs_create_config_file_h(root_path, >> stream)) != 0) >> goto done; >> >> - sprintf(stream->logFileCurrent, "%s_%s", >> stream->fileName, current_time); >> + stream->logFileCurrent = stream->fileName + >> "_" + current_time; >> >> /* Create the new log file based on updated >> configuration */ >> - *stream->p_fd = log_file_open(root_path, >> stream, >> - stream->logFileCurrent,NULL); >> + *stream->p_fd = log_file_open(root_path, >> + >> stream, >> + >> stream->logFileCurrent, >> + >> NULL); >> } >> >> /* Fix bug - this function makes return (-1) when create_files_f >> = false */ >> diff --git a/osaf/services/saf/logsv/lgs/lgs_stream.h >> b/osaf/services/saf/logsv/lgs/lgs_stream.h >> --- a/osaf/services/saf/logsv/lgs/lgs_stream.h >> +++ b/osaf/services/saf/logsv/lgs/lgs_stream.h >> @@ -18,9 +18,11 @@ >> #ifndef __LGS_STREAM_H >> #define __LGS_STREAM_H >> >> +#include <string> >> #include <ncspatricia.h> >> #include <time.h> >> #include <limits.h> >> + >> #include "lgs_fmt.h" >> >> /** >> @@ -33,8 +35,8 @@ typedef struct log_stream { >> >> /* --- Corresponds to IMM Class >> SaLogStream/SaLogStreamConfig --- */ >> char name[SA_MAX_NAME_LENGTH + 1]; /* add for null >> termination */ >> - char fileName[NAME_MAX]; >> - char pathName[PATH_MAX]; >> + std::string fileName; >> + std::string pathName; >> SaUint64T maxLogFileSize; >> SaUint32T fixedLogRecordSize; >> SaBoolT haProperty; /* app log stream only */ >> @@ -52,7 +54,7 @@ typedef struct log_stream { >> int32_t fd_shared; /* Checkpointed stream file >> descriptor for shared fs */ >> int32_t fd_local; /* Local stream file descriptor for >> split fs */ >> int32_t *p_fd; /* Points to shared or local fd depending on >> fs config */ >> - char logFileCurrent[NAME_MAX]; /* Current file >> name */ >> + std::string logFileCurrent; /* Current file name */ >> uint32_t curFileSize; /* Bytes written to current log file >> */ >> uint32_t logRecordId; /* log record indentifier increased >> for each record */ >> SaBoolT twelveHourModeFlag; /* Not used. Can be removed? >> */ >> @@ -68,8 +70,8 @@ typedef struct log_stream { >> >> /* Not checkpointed parameters. Used by standby in split file >> mode */ >> uint32_t stb_logRecordId; /* Last written Id. For checking Id >> inconsistency */ >> - char stb_logFileCurrent[NAME_MAX]; /* Current file >> name used on standby */ >> - char stb_prev_actlogFileCurrent[NAME_MAX]; /* >> current file name on active when previous record was written */ >> + std::string stb_logFileCurrent; /* Current file >> name used on standby */ >> + std::string stb_prev_actlogFileCurrent; /* current file name >> on active when previous record was written */ >> uint32_t stb_curFileSize; /* Bytes written to current log file >> */ >> } log_stream_t; >> >> @@ -78,8 +80,8 @@ extern void log_stream_delete(log_stream >> >> #define STREAM_NEW -1 >> extern log_stream_t *log_stream_new(SaNameT *name, >> - const char >> *filename, >> - const char >> *pathname, >> + const std::string >> &filename, >> + const std::string >> &pathname, >> SaUint64T >> maxLogFileSize, >> SaUint32T >> fixedLogRecordSize, >> >> SaLogFileFullActionT logFullAction, >> @@ -102,12 +104,14 @@ extern void log_stream_id_print(); >> >> #define LGS_STREAM_CREATE_FILES true >> int log_stream_config_change(bool create_files_f, >> - const char *root_path, >> - log_stream_t *stream, >> - const char >> *current_logfile_name, >> - time_t *cur_time_in); >> -extern int log_file_open(const char *root_path, log_stream_t *stream, >> - const char* filename, int >> *errno_save); >> + const std::string &root_path, >> + log_stream_t *stream, >> + const std::string >> ¤t_logfile_name, >> + time_t *cur_time_in); >> +extern int log_file_open(const std::string &root_path, >> + log_stream_t *stream, >> + const std::string &filename, >> + int *errno_save); >> >> /* Accessor functions */ >> extern log_stream_t *log_stream_get_by_name(const char *name); >> diff --git a/osaf/services/saf/logsv/lgs/lgs_util.cc >> b/osaf/services/saf/logsv/lgs/lgs_util.cc >> --- a/osaf/services/saf/logsv/lgs/lgs_util.cc >> +++ b/osaf/services/saf/logsv/lgs/lgs_util.cc >> @@ -43,6 +43,9 @@ >> #define LGS_CREATE_CLOSE_TIME_LEN 16 >> #define START_YEAR 1900 >> >> +// The length of '_yyyymmdd_hhmmss_yyyymmdd_hhmmss.log' including >> null-termination char >> +#define LOG_TAIL_MAX >> (std::string("_yyyymmdd_hhmmss_yyyymmdd_hhmmss.log").size()) >> + >> /** >> * Create config file according to spec. >> * @param root_path[in] >> @@ -50,70 +53,55 @@ >> * >> * @return -1 on error >> */ >> -int lgs_create_config_file_h(const char *root_path, log_stream_t *stream) >> +int lgs_create_config_file_h(const std::string &root_path, log_stream_t >> *stream) >> { >> lgsf_apipar_t apipar; >> lgsf_retcode_t api_rc; >> - void *params_in; >> + void *params_in = NULL; >> ccfh_t *header_in_p; >> size_t params_in_size; >> char *logFileFormat_p; >> char *pathname_p; >> >> int rc; >> - int path_len; >> uint32_t n = 0; >> - char pathname[PATH_MAX]; >> + std::string pathname; >> size_t logFileFormat_size = 0; >> size_t pathname_size = 0; >> >> + TRACE_ENTER(); >> >> - TRACE_ENTER(); >> - >> /* check the existence of logsv_root_dir/pathName, >> * check that the path is safe. >> * If ok, create the path if it doesn't already exits >> */ >> - path_len = snprintf(pathname, PATH_MAX, "%s/%s", >> - root_path, stream->pathName); >> - if (path_len >= PATH_MAX) { >> - LOG_WA("logsv_root_dir + pathName > >> PATH_MAX"); >> - rc = -1; >> - goto done; >> - } >> - >> + pathname = root_path + "/" + stream->pathName; >> if (lgs_relative_path_check_ts(pathname) == true) { >> - LOG_WA("Directory path \"%s\" not allowed", >> pathname); >> + LOG_WA("Directory path \"%s\" not allowed", >> pathname.c_str()); >> rc = -1; >> goto done; >> } >> >> if (lgs_make_reldir_h(stream->pathName) != 0) { >> LOG_WA("Create directory '%s/%s' failed", >> - root_path, stream->pathName); >> + root_path.c_str(), stream- >> >pathName.c_str()); >> rc = -1; >> goto done; >> } >> >> /* create absolute path for config file */ >> - n = snprintf(pathname, PATH_MAX, "%s/%s/%s.cfg", >> - root_path, stream->pathName, >> stream->fileName); >> - >> - if (n >= PATH_MAX) { >> - LOG_WA("Complete pathname > PATH_MAX"); >> - rc = -1; >> - goto done; >> - } >> - TRACE("%s - Config file path \"%s\"",__FUNCTION__, >> pathname); >> + pathname += "/" + stream->fileName + ".cfg"; >> >> - /* >> + TRACE("%s - Config file path \"%s\"", __FUNCTION__, >> pathname.c_str()); >> + >> + /* >> * Create the configuration file. >> * Open the file, write it's content and close the file >> */ >> >> /* Allocate memory for parameters */ >> params_in_size = sizeof(ccfh_t) + (strlen(stream- >> >logFileFormat) + 1) + >> - (strlen(pathname) + 1); >> + (pathname.size() + 1); >> params_in = malloc(params_in_size); >> >> /* Set pointers to allocated memory */ >> @@ -138,13 +126,9 @@ int lgs_create_config_file_h(const char >> LOG_WA("Log file format string too long"); >> goto done_free; >> } >> - n = snprintf(pathname_p, pathname_size, "%s", pathname); >> - if (n >= pathname_size) { >> - rc = -1; >> - LOG_WA("Path name string too long"); >> - goto done_free; >> - } >> - >> + >> + (void)snprintf(pathname_p, pathname_size, "%s", >> pathname.c_str()); >> + >> /* Fill in API structure */ >> apipar.req_code_in = LGSF_CREATECFGFILE; >> apipar.data_in_size = params_in_size; >> @@ -251,20 +235,19 @@ SaTimeT lgs_get_SaTime() >> * @return -1 if error >> */ >> int lgs_file_rename_h( >> - const char *root_path, >> - const char *rel_path, >> - const char *old_name, >> - const char *time_stamp, >> - const char *suffix, >> - char *new_name) >> + const std::string &root_path, >> + const std::string &rel_path, >> + const std::string &old_name, >> + const std::string &time_stamp, >> + const std::string &suffix, >> + std::string &new_name) >> { >> int rc; >> - char oldpath[PATH_MAX]; >> - char newpath[PATH_MAX]; >> - char new_name_loc[NAME_MAX]; >> - size_t n; >> + std::string oldpath; >> + std::string newpath; >> + std::string new_name_loc; >> lgsf_apipar_t apipar; >> - void *params_in_p; >> + void *params_in_p = NULL; >> size_t params_in_size; >> lgsf_retcode_t api_rc; >> char *oldpath_in_p; >> @@ -275,37 +258,26 @@ int lgs_file_rename_h( >> >> TRACE_ENTER(); >> >> - n = snprintf(oldpath, PATH_MAX, "%s/%s/%s%s", >> - root_path, rel_path, old_name, >> suffix); >> - if (n >= PATH_MAX) { >> - LOG_ER("Cannot rename file, old path > >> PATH_MAX"); >> - rc = -1; >> - goto done; >> + oldpath = root_path + "/" + rel_path + "/" + old_name + suffix; >> + >> + if (time_stamp.empty() == false) { >> + new_name_loc = old_name + "_" + time_stamp >> + suffix; >> + } else { >> + new_name_loc = new_name + suffix; >> } >> >> - if (time_stamp != NULL) { >> - snprintf(new_name_loc, NAME_MAX, >> "%s_%s%s", old_name, time_stamp, suffix); >> - } else { >> - snprintf(new_name_loc, NAME_MAX, "%s%s", >> new_name, suffix); >> + newpath = root_path + "/" + rel_path + "/" + new_name_loc; >> + >> + if (new_name.empty() == false) { >> + new_name = new_name_loc; >> } >> - n = snprintf(newpath, PATH_MAX, "%s/%s/%s", >> - root_path, rel_path, >> new_name_loc); >> - if (n >= PATH_MAX) { >> - LOG_ER("Cannot rename file, new path > >> PATH_MAX"); >> - rc = -1; >> - goto done; >> - } >> - >> - if (new_name != NULL) { >> - strcpy(new_name, new_name_loc); >> - } >> - >> - TRACE_4("Rename file from %s", oldpath); >> - TRACE_4(" to %s", newpath); >> - >> + >> + TRACE_4("Rename file from %s", oldpath.c_str()); >> + TRACE_4(" to %s", newpath.c_str()); >> + >> /* Allocate memory for parameters */ >> - oldpath_size = strlen(oldpath) + 1; >> - newpath_size = strlen(newpath) + 1; >> + oldpath_size = oldpath.size() + 1; >> + newpath_size = newpath.size() + 1; >> params_in_size = sizeof(size_t) + oldpath_size + >> newpath_size; >> >> params_in_p = malloc(params_in_size); >> @@ -317,9 +289,9 @@ int lgs_file_rename_h( >> >> /* Fill in parameters */ >> *oldpath_str_size_p = oldpath_size; >> - memcpy(oldpath_in_p, oldpath, oldpath_size); >> - memcpy(newpath_in_p, newpath, newpath_size); >> - >> + memcpy(oldpath_in_p, oldpath.c_str(), oldpath_size); >> + memcpy(newpath_in_p, newpath.c_str(), newpath_size); >> + >> /* Fill in API structure */ >> apipar.req_code_in = LGSF_RENAME_FILE; >> apipar.data_in_size = params_in_size; >> @@ -337,7 +309,6 @@ int lgs_file_rename_h( >> >> free(params_in_p); >> >> -done: >> TRACE_LEAVE(); >> return rc; >> } >> @@ -448,12 +419,13 @@ void lgs_free_write_log(const lgsv_write >> * @param path >> * @return true if path is not allowed >> */ >> -bool lgs_relative_path_check_ts(const char* path) >> +bool lgs_relative_path_check_ts(const std::string &path) >> { >> bool rc = false; >> - int len_path = strlen(path); >> + int len_path = path.size(); >> if (len_path >= 3) { >> - if (strstr(path, "/../") != NULL || strstr(path, >> "/..") != NULL) { >> + if (path.find("/../") != std::string::npos || >> + path.find("/..") != >> std::string::npos) { >> /* /..dir/ is not allowed, however >> /dir../ is allowed. */ >> rc = true; >> } else if (path[0] == '.' && path[1] == '.' && >> path[2] == '/') { >> @@ -476,49 +448,30 @@ bool lgs_relative_path_check_ts(const ch >> * @param path, Path relative log service root directory >> * @return -1 on error >> */ >> -int lgs_make_reldir_h(const char* path) >> +int lgs_make_reldir_h(const std::string &path) >> { >> lgsf_apipar_t apipar; >> lgsf_retcode_t api_rc; >> int rc = -1; >> mld_in_t params_in; >> - char new_rootstr[PATH_MAX]; >> - size_t n1, n2; >> - >> - new_rootstr[0] = '\0'; /* Initiate to empty string */ >> - >> + >> TRACE_ENTER(); >> >> - const char *logsv_root_dir = static_cast<const char *>( >> + const std::string logsv_root_dir = static_cast<const char *>( >> >> lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> - >> - TRACE("logsv_root_dir \"%s\"",logsv_root_dir); >> - TRACE("path \"%s\"",path); >> - >> - n1 = snprintf(params_in.root_dir, PATH_MAX, "%s", >> logsv_root_dir); >> - if (n1 >= PATH_MAX) { >> - LOG_WA("logsv_root_dir > PATH_MAX"); >> - goto done; >> - } >> - n2 = snprintf(params_in.rel_path, PATH_MAX, "%s", path); >> - if (n2 >= PATH_MAX) { >> - LOG_WA("path > PATH_MAX"); >> - goto done; >> - } >> - >> - /* Check that the complete path is not longer than PATH_MAX >> */ >> - if ((strlen(params_in.root_dir) + strlen(params_in.rel_path)) >> >= PATH_MAX) { >> - LOG_WA("root_dir + rel_path > PATH_MAX"); >> - goto done; >> - } >> - >> + >> + TRACE("logsv_root_dir \"%s\"", logsv_root_dir.c_str()); >> + TRACE("path \"%s\"", path.c_str()); >> + >> + params_in.root_dir = const_cast<char >> *>(logsv_root_dir.c_str()); >> + params_in.rel_path = const_cast<char *>(path.c_str()); >> + >> /* Fill in API structure */ >> apipar.req_code_in = LGSF_MAKELOGDIR; >> apipar.data_in_size = sizeof(mld_in_t); >> apipar.data_in = ¶ms_in; >> - apipar.data_out_size = PATH_MAX; >> - apipar.data_out = &new_rootstr; >> - >> + apipar.data_out_size = 0; >> + apipar.data_out = NULL; >> api_rc = log_file_api(&apipar); >> if (api_rc != LGSF_SUCESS) { >> TRACE("%s - API error >> %s",__FUNCTION__,lgsf_retcode_str(api_rc)); >> @@ -526,16 +479,7 @@ int lgs_make_reldir_h(const char* path) >> } else { >> rc = apipar.hdl_ret_code_out; >> } >> - >> - /* Handle a possible change of root dir to default */ >> - if (new_rootstr[0] != '\0') { >> - //lgs_imm_rootpathconf_set(new_rootstr); >> - /* LLDTEST1XXX Replace with new handling >> - */ >> - TRACE("%s - new_rootstr >> \"%s\"",__FUNCTION__,new_rootstr); >> - } >> >> -done: >> TRACE_LEAVE2("rc = %d",rc); >> >> return rc; >> @@ -615,36 +559,19 @@ int lgs_own_log_files_h(log_stream_t *st >> { >> lgsf_apipar_t apipar; >> lgsf_retcode_t api_rc; >> + int rc = 0, n; >> + std::string dir_path; >> olfbgh_t *data_in = static_cast<olfbgh_t >> *>(malloc(sizeof(olfbgh_t))); >> - int rc = 0, n, path_len; >> >> TRACE_ENTER2("stream %s",stream->name); >> >> /* Set in parameter dir_path */ >> - const char *logsv_root_dir = static_cast<const char >> *>(lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> + const std::string logsv_root_dir = static_cast<const char >> *>(lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> >> /* Set in parameter file_name */ >> - n = snprintf(data_in->file_name, SA_MAX_NAME_LENGTH, >> "%s", stream->fileName); >> - if (n >= SA_MAX_NAME_LENGTH) { >> - rc = -1; >> - LOG_WA("file_name > >> SA_MAX_NAME_LENGTH"); >> - goto done; >> - } >> - >> - n = snprintf(data_in->dir_path, PATH_MAX, "%s/%s", >> - logsv_root_dir, stream->pathName); >> - if (n >= PATH_MAX) { >> - rc = -1; >> - LOG_WA("dir_path > PATH_MAX"); >> - goto done; >> - } >> - >> - path_len = strlen(data_in->file_name) + strlen(data_in- >> >dir_path); >> - if (path_len > PATH_MAX) { >> - LOG_WA("Path to log files > PATH_MAX"); >> - rc = -1; >> - goto done; >> - } >> + data_in->file_name = const_cast<char *>(stream- >> >fileName.c_str()); >> + dir_path = logsv_root_dir + "/" + stream->pathName; >> + data_in->dir_path = const_cast<char *>(dir_path.c_str()); >> >> /* Set in parameter groupname */ >> n = snprintf(data_in->groupname, UT_NAMESIZE, "%s", >> groupname); >> @@ -681,7 +608,7 @@ done: >> * @param: str [in] input string for checking >> * @return: true if there is special character, otherwise false. >> */ >> -bool lgs_has_special_char(const char *str) >> +bool lgs_has_special_char(const std::string &str) >> { >> int index = 0; >> char c; >> @@ -734,3 +661,102 @@ bool lgs_has_special_char(const char *st >> } >> return false; >> } >> + >> + >> +/** >> + * Get the maximum length of filename >> + * >> + * @param:none >> + * @return: the maximum length of filename >> + */ >> +static size_t lgs_pathconf() >> +{ >> + static size_t name_max = 0; >> + static bool invoked = false; >> + static std::string old_path; >> + >> + std::string dir_path = static_cast<const char *>( >> + lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> + >> + /* To avoid invoking pathconf() unncessarily */ >> + if ((invoked == true) && (dir_path == old_path)) { >> + return name_max; >> + } >> + >> + errno = 0; >> + long max = pathconf(dir_path.c_str(), _PC_NAME_MAX); >> + >> + /* Get default value if the limit is not defined, or error */ >> + if (max == -1) { >> + max = 255; >> + invoked = false; >> + LOG_WA("pathconf error: %s", strerror(errno)); >> + } >> + >> + /* Backup the values to avoid calling pathconf() */ >> + name_max = max; >> + old_path = dir_path; >> + >> + invoked = true; >> + return name_max; >> +} >> + >> +/** >> + * Get the maximum length of a <filename> which is inputed from users >> + * exlcuded tail part. >> + * >> + * @param: none >> + * @return: the maximum length of <filename> >> + */ >> +size_t lgs_max_nlength() >> +{ >> + return (lgs_pathconf() - LOG_TAIL_MAX); >> +} >> + >> +/** >> + * Check if file length is valid. >> + * >> + * logsv will append the tail to fileName such as file extention, open time. >> + * and <fileName> is input from user (immcfg, imm.xml, log Open API), >> + * so once passing the checking, logsv does not need to be worry >> + * about the file name is over the limitation. >> + >> + * @param: fileName - file name for checking (excluse the tail part) >> + * @return: true if file is valid, false otherwise. >> + * >> + */ >> +bool lgs_is_valid_filelength(const std::string &fileName) >> +{ >> + size_t filelen = fileName.size() + 1; >> + size_t maxsize = lgs_pathconf(); >> + >> + return ((filelen + LOG_TAIL_MAX) < maxsize); >> +} >> + >> +/** >> + * Check if the length of the path to file is valid >> + * Path to file format: rootDir/pathToDir/<fileName><tail> >> + * >> + * @param: >> + * - path: the path to log file of the stream (excluse root dir). >> + * - fileName: the <fileName> of the log stream (excluse the tail part) >> + * @return: true if the path is valid, false otherwise. >> + */ >> +bool lgs_is_valid_pathlength(const std::string &path, >> + const std::string &fileName, >> + const std::string &rootPath) >> +{ >> + std::string rootpath; >> + size_t pathlen = path.size(); >> + size_t filelen = fileName.size(); >> + >> + if (rootPath.empty() == true) { >> + rootpath = static_cast<const char *>( >> + >> lgs_cfg_get(LGS_IMM_LOG_ROOT_DIRECTORY)); >> + } else { >> + rootpath = rootPath; >> + } >> + size_t rootlen = rootpath.size() + 1; >> + >> + return ((rootlen + pathlen + filelen + LOG_TAIL_MAX) < >> PATH_MAX); >> +} >> diff --git a/osaf/services/saf/logsv/lgs/lgs_util.h >> b/osaf/services/saf/logsv/lgs/lgs_util.h >> --- a/osaf/services/saf/logsv/lgs/lgs_util.h >> +++ b/osaf/services/saf/logsv/lgs/lgs_util.h >> @@ -51,23 +51,30 @@ >> */ >> >> extern char *lgs_get_time(time_t *time_in); >> -extern int lgs_create_config_file_h(const char *root_path, log_stream_t >> *stream); >> +extern int lgs_create_config_file_h(const std::string &root_path, >> log_stream_t *stream); >> extern void lgs_evt_destroy(lgsv_lgs_evt_t *evt); >> extern SaTimeT lgs_get_SaTime(); >> extern int lgs_file_rename_h( >> - const char *root_path, >> - const char *rel_path, >> - const char *old_name, >> - const char *time_stamp, >> - const char *suffix, >> - char *new_name); >> + const std::string &root_path, >> + const std::string &rel_path, >> + const std::string &old_name, >> + const std::string &time_stamp, >> + const std::string &suffix, >> + std::string &new_name); >> //extern uint32_t lgs_create_known_streams(lgs_cb_t *lgs_cb); /* Not >> used, no code */ >> extern void lgs_exit(const char *msg, SaAmfRecommendedRecoveryT >> rec_rcvr); >> -extern bool lgs_relative_path_check_ts(const char* path); >> -extern int lgs_make_reldir_h(const char* path); >> -extern int lgs_check_path_exists_h(const char *path_to_check); >> +extern bool lgs_relative_path_check_ts(const std::string &path); >> +extern int lgs_make_reldir_h(const std::string &path); >> +extern int lgs_check_path_exists_h(const std::string &path_to_check); >> extern gid_t lgs_get_data_gid(char *groupname); >> extern int lgs_own_log_files_h(log_stream_t *stream, const char >> *groupname); >> -extern bool lgs_has_special_char(const char *str); >> +extern bool lgs_has_special_char(const std::string &str); >> + >> +// Functions to check if the filename/path length is valid >> +size_t lgs_max_nlength(); >> +bool lgs_is_valid_filelength(const std::string &fileName); >> +bool lgs_is_valid_pathlength(const std::string &path, >> + const std::string &fileName, >> + const std::string &rootPath = >> ""); >> >> #endif /* ifndef __LGS_UTIL_H */ ------------------------------------------------------------------------------ Site24x7 APM Insight: Get Deep Visibility into Application Performance APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month Monitor end-to-end web transactions and take corrective actions now Troubleshoot faster and improve end-user experience. Signup Now! http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel