osaf/libs/common/cpsv/include/cpnd.h      |   1 +
 osaf/libs/common/cpsv/include/cpnd_cb.h   |   4 +-
 osaf/libs/common/cpsv/include/cpnd_init.h |   4 +-
 osaf/libs/core/include/ncs_osprm.h        |   6 +-
 osaf/services/saf/cpsv/cpnd/cpnd_proc.c   |  17 ++++++-
 osaf/services/saf/cpsv/cpnd/cpnd_res.c    |  69 +++++++++++++++++++++---------
 6 files changed, 69 insertions(+), 32 deletions(-)


Currently because of limitation in Leap ncs_os_posix_shm() function

the maxSectionSize defined in CKPT is of SaUint32T type and the offset which
is been derived from +maxSectionSize ,

Now the Ticket #1271 is enhanced leap functionality to accommodate SaUint64T ,
cpsv will align to uint64_t type to read/write large offset value.

Changed   ncs_os_posix_shm() interfaceing function of cpnd to
support SaOffsetT (SaUint64T)  size.

diff --git a/osaf/libs/common/cpsv/include/cpnd.h 
b/osaf/libs/common/cpsv/include/cpnd.h
--- a/osaf/libs/common/cpsv/include/cpnd.h
+++ b/osaf/libs/common/cpsv/include/cpnd.h
@@ -33,6 +33,7 @@
 #ifndef CPND_H
 #define CPND_H
 
+#include <stdint.h>
 #include "ncssysf_def.h"
 #include "ncs_main_papi.h"
 #include "ncssysf_tsk.h"
diff --git a/osaf/libs/common/cpsv/include/cpnd_cb.h 
b/osaf/libs/common/cpsv/include/cpnd_cb.h
--- a/osaf/libs/common/cpsv/include/cpnd_cb.h
+++ b/osaf/libs/common/cpsv/include/cpnd_cb.h
@@ -337,10 +337,10 @@ uint32_t cpnd_ckpt_replica_create_res(NC
 int32_t cpnd_find_free_loc(CPND_CB *cb, CPND_TYPE_INFO type);
 uint32_t cpnd_ckpt_write_header(CPND_CB *cb, uint32_t nckpts);
 uint32_t cpnd_cli_info_write_header(CPND_CB *cb, int32_t n_clients);
-uint32_t cpnd_write_client_info(CPND_CB *cb, CPND_CKPT_CLIENT_NODE *cl_node, 
int32_t offset);
+uint32_t cpnd_write_client_info(CPND_CB *cb, CPND_CKPT_CLIENT_NODE *cl_node, 
uint64_t offset);
 uint32_t cpnd_client_bitmap_set(SaCkptHandleT client_hdl);
 uint32_t cpnd_update_ckpt_with_clienthdl(CPND_CB *cb, CPND_CKPT_NODE *cp_node, 
SaCkptHandleT client_hdl);
-uint32_t cpnd_write_ckpt_info(CPND_CB *cb, CPND_CKPT_NODE *cp_node, int32_t 
offset, SaCkptHandleT client_hdl);
+uint32_t cpnd_write_ckpt_info(CPND_CB *cb, CPND_CKPT_NODE *cp_node, uint64_t 
offset, SaCkptHandleT client_hdl);
 int32_t cpnd_restart_shm_client_update(CPND_CB *cb, CPND_CKPT_CLIENT_NODE 
*cl_node);
 uint32_t client_bitmap_reset(uint32_t *bitmap_value, uint32_t client_hdl);
 uint32_t client_bitmap_isset(uint32_t bitmap_value);
diff --git a/osaf/libs/common/cpsv/include/cpnd_init.h 
b/osaf/libs/common/cpsv/include/cpnd_init.h
--- a/osaf/libs/common/cpsv/include/cpnd_init.h
+++ b/osaf/libs/common/cpsv/include/cpnd_init.h
@@ -90,9 +90,9 @@ uint32_t cpnd_ckpt_remote_cpnd_add(CPND_
 uint32_t cpnd_ckpt_remote_cpnd_del(CPND_CKPT_NODE *cp_node, MDS_DEST mds_info);
 int32_t cpnd_ckpt_get_lck_sec_id(CPND_CKPT_NODE *cp_node);
 uint32_t cpnd_ckpt_sec_write(CPND_CKPT_NODE *cp_node, CPND_CKPT_SECTION_INFO
-                         *sec_info, const void *data, uint32_t size, uint32_t 
offset, uint32_t type);
+                         *sec_info, const void *data, uint32_t size, uint64_t 
offset, uint32_t type);
 uint32_t cpnd_ckpt_sec_read(CPND_CKPT_NODE *cp_node, CPND_CKPT_SECTION_INFO
-                        *sec_info, void *data, uint32_t size, uint32_t offset);
+                        *sec_info, void *data, uint32_t size, uint64_t offset);
 void cpnd_proc_cpa_down(CPND_CB *cb, MDS_DEST dest);
 uint32_t cpnd_ckpt_update_replica(CPND_CB *cb, CPND_CKPT_NODE *cp_node,
                               CPSV_CKPT_ACCESS *write_data, uint32_t type, 
uint32_t *err_type, uint32_t *errflag);
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
@@ -564,7 +564,7 @@ uint32_t ncs_os_posix_mq(NCS_OS_POSIX_MQ
                uint32_t i_flags;
                uint32_t i_map_flags;
                uint64_t i_size;
-               int32_t i_offset;
+               uint64_t i_offset;
                void *o_addr;
                int32_t o_fd;
                uint32_t o_hdl;
@@ -586,7 +586,7 @@ uint32_t ncs_os_posix_mq(NCS_OS_POSIX_MQ
                void *i_addr;
                void *i_to_buff;
                uint64_t i_read_size;
-               int32_t i_offset;
+               uint64_t i_offset;
        } NCS_OS_POSIX_SHM_REQ_READ_INFO;
 
        typedef struct ncs_os_posix_shm_req_write_info {
@@ -594,7 +594,7 @@ uint32_t ncs_os_posix_mq(NCS_OS_POSIX_MQ
                void *i_addr;
                void *i_from_buff;
                uint64_t i_write_size;
-               int32_t i_offset;
+               uint64_t i_offset;
        } NCS_OS_POSIX_SHM_REQ_WRITE_INFO;
 
        typedef struct ncs_shm_req_info {
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
@@ -622,7 +622,7 @@ int32_t cpnd_ckpt_get_lck_sec_id(CPND_CK
  * Notes         : None.
  *****************************************************************************/
 uint32_t cpnd_ckpt_sec_write(CPND_CKPT_NODE *cp_node, CPND_CKPT_SECTION_INFO
-                         *sec_info, const void *data, uint32_t size, uint32_t 
offset, uint32_t type)
+                         *sec_info, const void *data, uint32_t size, uint64_t 
offset, uint32_t type)
 {                              /* for sync type=2 */
        uint32_t rc = NCSCC_RC_SUCCESS;
        NCS_OS_POSIX_SHM_REQ_INFO write_req;
@@ -647,6 +647,10 @@ uint32_t cpnd_ckpt_sec_write(CPND_CKPT_N
                                               (sec_info->lcl_sec_id * 
cp_node->create_attrib.maxSectionSize));
        write_req.info.write.i_from_buff = (uint8_t *)data;
 
+       if (offset > UINTMAX_MAX) {
+               LOG_ER("cpnd Section read failed,exceeded the write 
limits(UINT64_MAX) ");
+               return NCSCC_RC_FAILURE;                
+       }
        /* if ( type == 0) Needs to be cleaned up later TBD 
           write_req.info.write.i_offset=sec_info->size + offset;
           else */
@@ -694,12 +698,15 @@ uint32_t cpnd_ckpt_sec_write(CPND_CKPT_N
  * Notes         : None.
  *****************************************************************************/
 uint32_t cpnd_ckpt_sec_read(CPND_CKPT_NODE *cp_node, CPND_CKPT_SECTION_INFO
-                        *sec_info, void *data, uint32_t size, uint32_t offset)
+                        *sec_info, void *data, uint32_t size, uint64_t offset)
 {
 
        uint32_t rc = NCSCC_RC_SUCCESS;
        NCS_OS_POSIX_SHM_REQ_INFO read_req;
-
+       if (offset > UINTMAX_MAX) {
+               LOG_ER("cpnd Section read failed,exceeded the read 
limits(UINT64_MAX) ");
+               return NCSCC_RC_FAILURE;
+       }
        read_req.type = NCS_OS_POSIX_SHM_REQ_READ;
        read_req.info.read.i_addr = (void *)((char 
*)cp_node->replica_info.open.info.open.o_addr +
                                             sizeof(CPSV_CKPT_HDR) +
@@ -1828,6 +1835,10 @@ uint32_t cpnd_sec_hdr_update(CPND_CKPT_S
        sec_hdr.exp_tmr = sec_info->exp_tmr;
        sec_hdr.lastUpdate = sec_info->lastUpdate;
 
+       if ((sec_info->lcl_sec_id * (sizeof(CPSV_SECT_HDR) + 
cp_node->create_attrib.maxSectionSize)) > UINTMAX_MAX) {
+               LOG_ER("cpnd Section read failed,exceeded the update 
limits(UINT64_MAX) ");
+               return NCSCC_RC_FAILURE;
+       }
        write_req.type = NCS_OS_POSIX_SHM_REQ_WRITE;
        write_req.info.write.i_addr =
            (void *)((char *)cp_node->replica_info.open.info.open.o_addr + 
sizeof(CPSV_CKPT_HDR));
diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_res.c 
b/osaf/services/saf/cpsv/cpnd/cpnd_res.c
--- a/osaf/services/saf/cpsv/cpnd/cpnd_res.c
+++ b/osaf/services/saf/cpsv/cpnd/cpnd_res.c
@@ -46,8 +46,8 @@
 
 static uint32_t cpnd_res_ckpt_sec_add(CPND_CKPT_SECTION_INFO *pSecPtr, 
CPND_CKPT_NODE *cp_node);
 static bool cpnd_find_exact_ckptinfo(CPND_CB *cb, CKPT_INFO *ckpt_info, 
uint32_t bitmap_offset,
-                                        uint32_t *offset, uint32_t 
*prev_offset);
-static void cpnd_clear_ckpt_info(CPND_CB *cb, CPND_CKPT_NODE *cp_node, 
uint32_t curr_offset, uint32_t prev_offset);
+                                        uint64_t *offset, uint64_t 
*prev_offset);
+static void cpnd_clear_ckpt_info(CPND_CB *cb, CPND_CKPT_NODE *cp_node, 
uint64_t curr_offset, uint64_t prev_offset);
 
 
/*******************************************************************************
 *
  * Name           : cpnd_client_extract_bits
@@ -205,14 +205,20 @@ uint32_t cpnd_ckpt_replica_create_res(NC
                read_req.type = NCS_OS_POSIX_SHM_REQ_READ;
                read_req.info.read.i_addr = (void *)((char 
*)open_req->info.open.o_addr + sizeof(CPSV_CKPT_HDR));
                read_req.info.read.i_read_size = sizeof(CPSV_SECT_HDR);
+               if ((counter * (sizeof(CPSV_SECT_HDR) + 
(*cp_node)->create_attrib.maxSectionSize)) > UINTMAX_MAX) {
+                       LOG_ER("cpnd Section read failed,exceeded the read 
limits(UINT64_MAX) ");                       
+                       rc = NCSCC_RC_FAILURE;
+                       goto end;
+               }
+
                read_req.info.read.i_offset =
                    counter * (sizeof(CPSV_SECT_HDR) + 
(*cp_node)->create_attrib.maxSectionSize);
                read_req.info.read.i_to_buff = (CPSV_SECT_HDR *)&sect_hdr;
                rc = ncs_os_posix_shm(&read_req);
                if (rc != NCSCC_RC_SUCCESS) {
                        LOG_ER("cpnd sect HDR read failed");
-                       /*   assert(0); */
-                       return rc;
+                       rc = NCSCC_RC_FAILURE;
+                       goto end;               
                }
 
                /*  macro for reading the section header information  */
@@ -296,7 +302,8 @@ void cpnd_restart_update_timer(CPND_CB *
 
 void *cpnd_restart_shm_create(NCS_OS_POSIX_SHM_REQ_INFO *cpnd_open_req, 
CPND_CB *cb, SaClmNodeIdT nodeid)
 {
-       uint32_t counter = 0, count, num_bitset = 0, n_clients, rc = 
NCSCC_RC_SUCCESS, i_offset, bit_position;
+       uint32_t counter = 0, count, num_bitset = 0, n_clients, rc = 
NCSCC_RC_SUCCESS, bit_position;
+       uint64_t i_offset;
        int32_t next_offset;
        CPND_CKPT_CLIENT_NODE *cl_node = NULL;
        CPND_CKPT_NODE *cp_node = NULL;
@@ -597,6 +604,11 @@ int32_t cpnd_find_free_loc(CPND_CB *cb, 
        switch (type) {
        case CPND_CLIENT_INFO:
                do {
+
+                       if ((counter * sizeof(CLIENT_INFO)) > UINTMAX_MAX) {
+                               LOG_ER("cpnd Section read failed,exceeded the 
read limits(UINT64_MAX) ");
+                               return -2;
+                       }
                        read_req.type = NCS_OS_POSIX_SHM_REQ_READ;
                        read_req.info.read.i_addr = (void *)((char 
*)cb->shm_addr.cli_addr + sizeof(CLIENT_HDR));
                        read_req.info.read.i_read_size = sizeof(CLIENT_INFO);
@@ -624,6 +636,10 @@ int32_t cpnd_find_free_loc(CPND_CB *cb, 
 
        case CPND_CKPT_INFO:
                do {
+                       if ((counter * sizeof(CKPT_INFO)) > UINTMAX_MAX) {
+                               LOG_ER("cpnd Section read failed,exceeded the 
read limits(UINT64_MAX) ");
+                               return -2;
+                       }
                        read_req.type = NCS_OS_POSIX_SHM_REQ_READ;
                        read_req.info.read.i_addr = (void *)((char 
*)cb->shm_addr.ckpt_addr + sizeof(CKPT_HDR));
                        read_req.info.read.i_read_size = sizeof(CKPT_INFO);
@@ -696,7 +712,8 @@ uint32_t cpnd_ckpt_write_header(CPND_CB 
 
*********************************************************************************************/
 uint32_t cpnd_cli_info_write_header(CPND_CB *cb, int32_t n_clients)
 {
-       uint32_t rc = NCSCC_RC_SUCCESS, offset;
+       uint32_t rc = NCSCC_RC_SUCCESS;
+       uint64_t offset;
        CLIENT_HDR cl_hdr;
        memset(&cl_hdr, '\0', sizeof(CLIENT_HDR));
 
@@ -718,13 +735,14 @@ uint32_t cpnd_cli_info_write_header(CPND
  *
  * Return Values : Success / Error
 
******************************************************************************************/
-uint32_t cpnd_write_client_info(CPND_CB *cb, CPND_CKPT_CLIENT_NODE *cl_node, 
int32_t offset)
+uint32_t cpnd_write_client_info(CPND_CB *cb, CPND_CKPT_CLIENT_NODE *cl_node, 
uint64_t offset)
 {
        CLIENT_INFO cl_info;
        NCS_OS_POSIX_SHM_REQ_INFO write_req;
        memset(&cl_info, '\0', sizeof(CLIENT_INFO));
        memset(&write_req, '\0', sizeof(NCS_OS_POSIX_SHM_REQ_INFO));
-       uint32_t rc = NCSCC_RC_SUCCESS, i_offset;
+       uint32_t rc = NCSCC_RC_SUCCESS;
+       uint64_t i_offset;
 
        cl_info.ckpt_app_hdl = cl_node->ckpt_app_hdl;
        cl_info.ckpt_open_ref_cnt = cl_node->ckpt_open_ref_cnt;
@@ -822,12 +840,12 @@ uint32_t cpnd_client_bitmap_set(SaCkptHa
  *
 
**************************************************************************************************/
 
-bool cpnd_find_exact_ckptinfo(CPND_CB *cb, CKPT_INFO *ckpt_info, uint32_t 
bitmap_offset, uint32_t *offset,
-                                 uint32_t *prev_offset)
+bool cpnd_find_exact_ckptinfo(CPND_CB *cb, CKPT_INFO *ckpt_info, uint32_t 
bitmap_offset, uint64_t *offset,
+                                 uint64_t *prev_offset)
 {
        int32_t next;
        CKPT_INFO prev_ckpt_info;
-       uint32_t i_offset;
+       uint64_t i_offset;
        bool found = false;
 
        TRACE_ENTER();
@@ -868,9 +886,10 @@ bool cpnd_find_exact_ckptinfo(CPND_CB *c
 uint32_t cpnd_update_ckpt_with_clienthdl(CPND_CB *cb, CPND_CKPT_NODE *cp_node, 
SaCkptHandleT client_hdl)
 {
        CKPT_INFO ckpt_info, prev_ckpt_info, new_ckpt_info;
-       uint32_t bitmap_offset = 0, bitmap_value = 0, i_offset, prev_offset, 
offset, rc = NCSCC_RC_SUCCESS;
+       uint32_t bitmap_offset = 0, bitmap_value = 0, rc = NCSCC_RC_SUCCESS;
        bool found = false;
-
+       uint64_t i_offset, prev_offset, offset; 
+       
        TRACE_ENTER();
        memset(&ckpt_info, '\0', sizeof(CKPT_INFO));
        memset(&prev_ckpt_info, '\0', sizeof(CKPT_INFO));
@@ -961,10 +980,11 @@ uint32_t cpnd_update_ckpt_with_clienthdl
            else find the next free location and there update the checkpoint 
information
  
************************************************************************************************************/
 
-uint32_t cpnd_write_ckpt_info(CPND_CB *cb, CPND_CKPT_NODE *cp_node, int32_t 
offset, SaCkptHandleT client_hdl)
+uint32_t cpnd_write_ckpt_info(CPND_CB *cb, CPND_CKPT_NODE *cp_node, uint64_t 
offset, SaCkptHandleT client_hdl)
 {
        CKPT_INFO ckpt_info;
-       uint32_t rc = NCSCC_RC_SUCCESS, i_offset;
+       uint32_t rc = NCSCC_RC_SUCCESS;
+       uint64_t i_offset;
 
        TRACE_ENTER();
        memset(&ckpt_info, 0, sizeof(CKPT_INFO));
@@ -1075,12 +1095,16 @@ uint32_t cpnd_restart_client_node_del(CP
        clinfo_write.type = NCS_OS_POSIX_SHM_REQ_WRITE;
        clinfo_write.info.write.i_addr = (void *)((char *)cb->shm_addr.cli_addr 
+ sizeof(CLIENT_HDR));
        clinfo_write.info.write.i_from_buff = (CLIENT_INFO *)&cl_info;
+       if ((cl_node->offset * sizeof(CLIENT_INFO)) > UINTMAX_MAX) {
+               LOG_ER("cpnd Section read failed,exceeded the read 
limits(UINT64_MAX) ");
+               return NCSCC_RC_FAILURE;
+       }
        clinfo_write.info.write.i_offset = cl_node->offset * 
sizeof(CLIENT_INFO);
        clinfo_write.info.write.i_write_size = sizeof(CLIENT_INFO);
        rc = ncs_os_posix_shm(&clinfo_write);
        if (rc != NCSCC_RC_SUCCESS) {
                LOG_ER("cpnd ckpt info write failed"); 
-               return rc;
+               return NCSCC_RC_FAILURE;
        } else {
                TRACE_1("cpnd ckpt info write success");
        }
@@ -1151,8 +1175,8 @@ uint32_t cpnd_restart_shm_ckpt_free(CPND
 {
        CKPT_INFO ckpt_info;
        CKPT_HDR ckpt_hdr;
-       uint32_t rc = NCSCC_RC_SUCCESS, i_offset, no_ckpts = 0;
-
+       uint32_t rc = NCSCC_RC_SUCCESS, no_ckpts = 0;
+       uint64_t i_offset;
        TRACE_ENTER();
        memset(&ckpt_info, '\0', sizeof(CKPT_INFO));
 
@@ -1255,10 +1279,10 @@ void cpnd_restart_reset_close_flag(CPND_
  *
  * Return Values:
 
************************************************************************************************************/
-void cpnd_clear_ckpt_info(CPND_CB *cb, CPND_CKPT_NODE *cp_node, uint32_t 
curr_offset, uint32_t prev_offset)
+void cpnd_clear_ckpt_info(CPND_CB *cb, CPND_CKPT_NODE *cp_node, uint64_t 
curr_offset, uint64_t prev_offset)
 {
        CKPT_INFO prev_ckpt_info, curr_ckpt_info, next_ckpt_info;
-       uint32_t i_offset, no_ckpts;
+       uint64_t i_offset, no_ckpts;
        CKPT_HDR ckpt_hdr;
 
        TRACE_ENTER();
@@ -1338,7 +1362,7 @@ void cpnd_restart_client_reset(CPND_CB *
        CKPT_INFO ckpt_info;
        uint32_t bitmap_offset = 0, num_bitset = 0;
        bool found = false;
-       uint32_t offset, prev_offset;
+       uint64_t offset, prev_offset;
        SaCkptHandleT client_hdl = cl_node->ckpt_app_hdl;
 
 
@@ -1388,7 +1412,8 @@ void cpnd_restart_client_reset(CPND_CB *
  
**********************************************************************************************/
 uint32_t cpnd_restart_shm_ckpt_update(CPND_CB *cb, CPND_CKPT_NODE *cp_node, 
SaCkptHandleT client_hdl)
 {
-       int32_t ckpt_id_exists = 0, no_ckpts = 0;
+       int32_t no_ckpts = 0;
+       uint64_t ckpt_id_exists = 0;
        CKPT_INFO ckpt_info;
        memset(&ckpt_info, 0, sizeof(ckpt_info));
        CKPT_HDR ckpt_hdr;

------------------------------------------------------------------------------
One dashboard for servers and applications across Physical-Virtual-Cloud 
Widest out-of-the-box monitoring support with 50+ applications
Performance metrics, stats and reports that give you Actionable Insights
Deep dive visibility with transaction tracing using APM Insight.
http://ad.doubleclick.net/ddm/clk/290420510;117567292;y
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to