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 *)§_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