[Groonga-commit] groonga/grnxx at 25e30fd [master] Fix a bug that divide_idle_node() corrupts a doubly linked list.

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index