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

Reply via email to