From d5bc00c27f86831054dd7a2ce6ef4d0883164db7 Mon Sep 17 00:00:00 2001 From: Alexander Lysikov <alexander.lysikov@demlabs.net> Date: Wed, 30 Mar 2022 22:09:21 +0500 Subject: [PATCH] fixed bug 5906 --- .../global-db/dap_chain_global_db_remote.c | 111 +++++++++--------- 1 file changed, 55 insertions(+), 56 deletions(-) diff --git a/modules/global-db/dap_chain_global_db_remote.c b/modules/global-db/dap_chain_global_db_remote.c index f5b149e950..044a8ef9b1 100644 --- a/modules/global-db/dap_chain_global_db_remote.c +++ b/modules/global-db/dap_chain_global_db_remote.c @@ -295,65 +295,64 @@ unsigned char *pdata; * @param store_obj_count[out] a number of deserialized objects in the array * @return Returns a pointer to the first object in the array, if successful; otherwise NULL. */ -dap_store_obj_t *dap_store_unpacket_multiple(const dap_store_obj_pkt_t *pkt, size_t *store_obj_count) +dap_store_obj_t *dap_store_unpacket_multiple(const dap_store_obj_pkt_t *a_pkt, size_t *a_store_obj_count) { - if(!pkt || pkt->data_size < 1) + if(!a_pkt || a_pkt->data_size < 1) return NULL; - uint64_t offset = 0; - uint32_t count = pkt->obj_count; - dap_store_obj_t *store_obj = DAP_NEW_SIZE(dap_store_obj_t, count * sizeof(struct dap_store_obj)); - for(size_t q = 0; q < count; ++q) { - dap_store_obj_t *obj = store_obj + q; - uint16_t str_length; + uint64_t l_offset = 0; + uint32_t l_count = a_pkt->obj_count, l_cur_count; + dap_store_obj_t *l_store_obj = DAP_NEW_Z_SIZE(dap_store_obj_t, l_count * sizeof(struct dap_store_obj)); + for(l_cur_count = 0; l_cur_count < l_count; ++l_cur_count) { + dap_store_obj_t *l_obj = l_store_obj + l_cur_count; + uint16_t l_str_length; uint32_t l_type; - if (offset+sizeof (uint32_t)> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'type' field"); break;} // Check for buffer boundries - memcpy(&l_type, pkt->data + offset, sizeof(uint32_t)); - obj->type = l_type; - offset += sizeof(uint32_t); - - if (offset+sizeof (uint16_t)> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'group_length' field"); break;} // Check for buffer boundries - memcpy(&str_length, pkt->data + offset, sizeof(uint16_t)); - offset += sizeof(uint16_t); - - if (offset+str_length> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'group' field"); break;} // Check for buffer boundries - obj->group = DAP_NEW_SIZE(char, str_length + 1); - memcpy((char *)obj->group, pkt->data + offset, str_length); - ((char *)obj->group)[str_length] = '\0'; - offset += str_length; - - if (offset+sizeof (uint64_t)> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'id' field"); break;} // Check for buffer boundries - memcpy(&obj->id, pkt->data + offset, sizeof(uint64_t)); - offset += sizeof(uint64_t); - - if (offset+sizeof (uint64_t)> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'timestamp' field"); break;} // Check for buffer boundries - memcpy(&obj->timestamp, pkt->data + offset, sizeof(uint64_t)); - offset += sizeof(uint64_t); - - if (offset+sizeof (uint16_t)> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'key_length' field"); break;} // Check for buffer boundries - memcpy(&str_length, pkt->data + offset, sizeof(uint16_t)); - offset += sizeof(uint16_t); - - if (offset+ str_length > pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'key' field"); break;} // Check for buffer boundries - obj->key = DAP_NEW_SIZE(char, str_length + 1); - memcpy((char *)obj->key, pkt->data + offset, str_length); - ((char *)obj->key)[str_length] = '\0'; - offset += str_length; - - if (offset+sizeof (uint64_t)> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'value_length' field"); break;} // Check for buffer boundries - memcpy(&obj->value_len, pkt->data + offset, sizeof(uint64_t)); - offset += sizeof(uint64_t); - - if (offset+obj->value_len> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'value' field"); break;} // Check for buffer boundries - obj->value = DAP_NEW_SIZE(uint8_t, obj->value_len); - memcpy((char *)obj->value, pkt->data + offset, obj->value_len); - offset += obj->value_len; + if (l_offset+sizeof (uint32_t)> a_pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'type' field"); break;} // Check for buffer boundries + memcpy(&l_type, a_pkt->data + l_offset, sizeof(uint32_t)); + l_obj->type = l_type; + l_offset += sizeof(uint32_t); + + if (l_offset+sizeof (uint16_t)> a_pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'group_length' field"); break;} // Check for buffer boundries + memcpy(&l_str_length, a_pkt->data + l_offset, sizeof(uint16_t)); + l_offset += sizeof(uint16_t); + + if (l_offset+l_str_length> a_pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'group' field"); break;} // Check for buffer boundries + l_obj->group = DAP_NEW_SIZE(char, l_str_length + 1); + memcpy(l_obj->group, a_pkt->data + l_offset, l_str_length); + l_obj->group[l_str_length] = '\0'; + l_offset += l_str_length; + + if (l_offset+sizeof (uint64_t)> a_pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'id' field"); break;} // Check for buffer boundries + memcpy(&l_obj->id, a_pkt->data + l_offset, sizeof(uint64_t)); + l_offset += sizeof(uint64_t); + + if (l_offset+sizeof (uint64_t)> a_pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'timestamp' field"); break;} // Check for buffer boundries + memcpy(&l_obj->timestamp, a_pkt->data + l_offset, sizeof(uint64_t)); + l_offset += sizeof(uint64_t); + + if (l_offset+sizeof (uint16_t)> a_pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'key_length' field"); break;} // Check for buffer boundries + memcpy(&l_str_length, a_pkt->data + l_offset, sizeof(uint16_t)); + l_offset += sizeof(uint16_t); + + if (l_offset+ l_str_length > a_pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'key' field"); break;} // Check for buffer boundries + l_obj->key = DAP_NEW_SIZE(char, l_str_length + 1); + memcpy(l_obj->key, a_pkt->data + l_offset, l_str_length); + l_obj->key[l_str_length] = '\0'; + l_offset += l_str_length; + + if (l_offset+sizeof (uint64_t)> a_pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'value_length' field"); break;} // Check for buffer boundries + memcpy(&l_obj->value_len, a_pkt->data + l_offset, sizeof(uint64_t)); + l_offset += sizeof(uint64_t); + + if (l_offset+l_obj->value_len> a_pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'value' field"); break;} // Check for buffer boundries + l_obj->value = DAP_NEW_SIZE(uint8_t, l_obj->value_len); + memcpy(l_obj->value, a_pkt->data + l_offset, l_obj->value_len); + l_offset += l_obj->value_len; } - - assert(pkt->data_size == offset); - - if(store_obj_count) - *store_obj_count = count; - - return store_obj; + assert(a_pkt->data_size == l_offset); + // Return the number of completely filled dap_store_obj_t structures + // because l_cur_count may be less than l_count due to too little memory + if(a_store_obj_count) + *a_store_obj_count = l_cur_count; + return l_store_obj; } -- GitLab