diff options
author | Tomasz Lewandowski <tomasz.lewandoski@delphi.com> | 2016-12-02 03:46:14 -0800 |
---|---|---|
committer | Ingo Huerner <ingo_huerner@mentor.com> | 2016-12-05 14:34:39 +0100 |
commit | 4e39784a0de1f2f30e1afb3cde3776dbdc4e2cac (patch) | |
tree | a28abf8ebc18ebb5523d345b2af828dd13e62966 /src/key-value-store/database/kissdb.c | |
parent | 395b0f504e05ee6c59c1b9d9267c793e072a19ba (diff) | |
download | persistence-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.c | 24 |
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 } |