osaf/libs/core/include/ncs_osprm.h | 9 +++++++++ osaf/libs/core/leap/os_defs.c | 19 +++++++++++++++++-- osaf/services/saf/cpsv/cpnd/cpnd_proc.c | 16 ++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-)
problem: when checkpoint service init without shared memory size guaranteed works in high memory load, core dump occur while adding section to checkpoint. solution: check the true size of shared memory before writing to it. diff --git a/osaf/libs/core/include/ncs_osprm.h b/osaf/libs/core/include/ncs_osprm.h --- a/osaf/libs/core/include/ncs_osprm.h +++ b/osaf/libs/core/include/ncs_osprm.h @@ -557,6 +557,7 @@ typedef enum { NCS_OS_POSIX_SHM_REQ_UNLINK, /* unlink is shm_unlink */ NCS_OS_POSIX_SHM_REQ_READ, NCS_OS_POSIX_SHM_REQ_WRITE, + NCS_OS_POSIX_SHM_REQ_STATS, NCS_OS_POSIX_SHM_REQ_MAX } NCS_OS_POSIX_SHM_REQ_TYPE; typedef struct ncs_os_posix_shm_req_open_info_tag { @@ -598,6 +599,13 @@ typedef struct ncs_os_posix_shm_req_writ uint64_t i_offset; } NCS_OS_POSIX_SHM_REQ_WRITE_INFO; +typedef struct ncs_os_posix_shm_req_stats_info_tag { + uint32_t i_hdl; + int32_t i_fd; + bool ensures_space; + void *o_addr; +} NCS_OS_POSIX_SHM_REQ_STATS_INFO; + typedef struct ncs_shm_req_info { NCS_OS_POSIX_SHM_REQ_TYPE type; @@ -607,6 +615,7 @@ typedef struct ncs_shm_req_info { NCS_OS_POSIX_SHM_REQ_UNLINK_INFO unlink; NCS_OS_POSIX_SHM_REQ_READ_INFO read; NCS_OS_POSIX_SHM_REQ_WRITE_INFO write; + NCS_OS_POSIX_SHM_REQ_STATS_INFO stats; } info; } NCS_OS_POSIX_SHM_REQ_INFO; diff --git a/osaf/libs/core/leap/os_defs.c b/osaf/libs/core/leap/os_defs.c --- a/osaf/libs/core/leap/os_defs.c +++ b/osaf/libs/core/leap/os_defs.c @@ -799,9 +799,9 @@ uint32_t ncs_os_posix_shm(NCS_OS_POSIX_S } } else { if (ftruncate(req->info.open.o_fd, (off_t) shm_size /* off_t == long */ ) < 0) { - printf("ftruncate failed with errno value %d \n", errno); + LOG_WA("ftruncate failed with errno value %d \n", errno); return NCSCC_RC_FAILURE; - } + } } uint32_t prot_flag = ncs_shm_prot_flags(req->info.open.i_flags); @@ -859,6 +859,21 @@ uint32_t ncs_os_posix_shm(NCS_OS_POSIX_S req->info.write.i_write_size); break; + case NCS_OS_POSIX_SHM_REQ_STATS: + if (!req->info.stats.o_addr) { + printf("Output space is not defined\n"); + return NCSCC_RC_FAILURE; + } + + if (req->info.stats.ensures_space) { + return NCSCC_RC_SUCCESS; + } else { + if(fstat(req->info.stats.i_fd, req->info.stats.o_addr)) { + return NCSCC_RC_FAILURE; + } + } + break; + default: printf("Option Not supported %d \n", req->type); return NCSCC_RC_FAILURE; diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_proc.c b/osaf/services/saf/cpsv/cpnd/cpnd_proc.c --- a/osaf/services/saf/cpsv/cpnd/cpnd_proc.c +++ b/osaf/services/saf/cpsv/cpnd/cpnd_proc.c @@ -1851,6 +1851,22 @@ uint32_t cpnd_sec_hdr_update(CPND_CKPT_S CPSV_SECT_HDR sec_hdr; uint32_t rc = NCSCC_RC_SUCCESS; NCS_OS_POSIX_SHM_REQ_INFO write_req; + struct stat shm_stat; + memset(&write_req, '\0', sizeof(write_req)); + memset(&shm_stat, '\0', sizeof(shm_stat)); + write_req.type = NCS_OS_POSIX_SHM_REQ_STATS; + write_req.info.stats.i_fd = cp_node->replica_info.open.info.open.o_fd; + write_req.info.stats.ensures_space = false; + write_req.info.stats.o_addr = &shm_stat; + shm_stat.st_size = sizeof(CPSV_CKPT_HDR) + (sec_info->lcl_sec_id + 1) * (sizeof(CPSV_SECT_HDR) + cp_node->create_attrib.maxSectionSize); + rc = ncs_os_posix_shm(&write_req); + if (rc != NCSCC_RC_SUCCESS) { + return rc; + } + + if (shm_stat.st_size < sizeof(CPSV_CKPT_HDR) + (sec_info->lcl_sec_id + 1) * (sizeof(CPSV_SECT_HDR) + cp_node->create_attrib.maxSectionSize)) { + return NCSCC_RC_OUT_OF_MEM; + } memset(&write_req, '\0', sizeof(write_req)); memset(&sec_hdr, '\0', sizeof(CPSV_SECT_HDR)); sec_hdr.lcl_sec_id = sec_info->lcl_sec_id; ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel