summaryrefslogtreecommitdiff
path: root/src/key-value-store/database/kissdb.c
diff options
context:
space:
mode:
authorTomasz Lewandowski <tomasz.lewandoski@delphi.com>2016-12-02 03:46:14 -0800
committerIngo Huerner <ingo_huerner@mentor.com>2016-12-05 14:34:39 +0100
commit4e39784a0de1f2f30e1afb3cde3776dbdc4e2cac (patch)
treea28abf8ebc18ebb5523d345b2af828dd13e62966 /src/key-value-store/database/kissdb.c
parent395b0f504e05ee6c59c1b9d9267c793e072a19ba (diff)
downloadpersistence-common-object-4e39784a0de1f2f30e1afb3cde3776dbdc4e2cac.tar.gz
Fix crash in KISSDB_IteratorNext caused by problem with handling deleted items. [IHU-12393]
Change-Id: I0b072d5d0cec636102823390de9ef1ccef7b24e5 Signed-off-by: Tomasz Lewandowski <tomasz.lewandoski@delphi.com>
Diffstat (limited to 'src/key-value-store/database/kissdb.c')
-rw-r--r--src/key-value-store/database/kissdb.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/key-value-store/database/kissdb.c b/src/key-value-store/database/kissdb.c
index 7c0695d..70feeef 100644
--- a/src/key-value-store/database/kissdb.c
+++ b/src/key-value-store/database/kissdb.c
@@ -1310,6 +1310,7 @@ int KISSDB_Iterator_next(KISSDB_Iterator* dbi, void* kbuf, void* vbuf)
{
DataBlock_s* block;
Hashtable_slot_s* ht;
+ int retVal = KISSDB_ITERATOR_NEXT_ITEM_NOT_FOUND;
int64_t offset;
if(dbi->db->htMappedSize < dbi->db->shared->htShmSize)
@@ -1347,7 +1348,7 @@ int KISSDB_Iterator_next(KISSDB_Iterator* dbi, void* kbuf, void* vbuf)
dbi->h_idx = 0;
if (++dbi->h_no >= (dbi->db->shared->htNum))
{
- return 0;
+ return KISSDB_ITERATOR_NEXT_ITEM_NOT_FOUND;//0
}
else
{
@@ -1369,20 +1370,29 @@ int KISSDB_Iterator_next(KISSDB_Iterator* dbi, void* kbuf, void* vbuf)
return KISSDB_ERROR_IO;
}
- block = (DataBlock_s*) (dbi->db->mappedDb + offset);
- memcpy(kbuf,block->key, dbi->db->keySize);
- if (vbuf != NULL)
+ retVal = KISSDB_ITERATOR_NEXT_ITEM_FOUND;
+ if (offset >= 0)
+ {
+ block = (DataBlock_s*) (dbi->db->mappedDb + offset);
+ memcpy(kbuf,block->key, dbi->db->keySize);
+
+ if (vbuf != NULL)
+ {
+ memcpy(vbuf, block->value, dbi->db->valSize);
+ }
+ }
+ else
{
- memcpy(vbuf, block->value, dbi->db->valSize);
+ retVal = KISSDB_ITERATOR_DELETED_ITEM;
}
if (++dbi->h_idx >= dbi->db->htSize)
{
dbi->h_idx = 0;
++dbi->h_no;
}
- return 1;
+ return retVal;//1
}
- return 0;
+ return KISSDB_ITERATOR_NEXT_ITEM_NOT_FOUND;//0
}