susumu.yata
null+****@clear*****
Fri May 24 10:37:36 JST 2013
susumu.yata 2013-05-24 10:37:36 +0900 (Fri, 24 May 2013) New Revision: 25e30fdaab79e0749f0419032b70a4d5f9556138 https://github.com/groonga/grnxx/commit/25e30fdaab79e0749f0419032b70a4d5f9556138 Message: Fix a bug that divide_idle_node() corrupts a doubly linked list. Modified files: lib/grnxx/storage/storage_impl.cpp Modified: lib/grnxx/storage/storage_impl.cpp (+11 -0) =================================================================== --- lib/grnxx/storage/storage_impl.cpp 2013-05-23 14:41:44 +0900 (6e415e2) +++ lib/grnxx/storage/storage_impl.cpp 2013-05-24 10:37:36 +0900 (1b12f4b) @@ -663,6 +663,13 @@ NodeHeader *StorageImpl::create_idle_node(uint64_t size) { } bool StorageImpl::divide_idle_node(NodeHeader *node_header, uint64_t size) { + NodeHeader *next_node_header = nullptr; + if (node_header->next_node_id != STORAGE_INVALID_NODE_ID) { + next_node_header = get_node_header(node_header->next_node_id); + if (!next_node_header) { + return false; + } + } NodeHeader * const second_node_header = reserve_phantom_node(); if (!second_node_header) { return false; @@ -675,8 +682,12 @@ bool StorageImpl::divide_idle_node(NodeHeader *node_header, uint64_t size) { second_node_header->chunk_id = node_header->chunk_id; second_node_header->offset = node_header->offset + size; second_node_header->size = node_header->size - size; + second_node_header->next_node_id = node_header->next_node_id; second_node_header->prev_node_id = node_header->id; second_node_header->modified_time = clock_.now(); + if (next_node_header) { + next_node_header->prev_node_id = second_node_header->id; + } node_header->size = size; node_header->next_node_id = second_node_header->id; second_node_header->modified_time = clock_.now(); -------------- next part -------------- HTML����������������������������...Download