Index file:
version: 2.1
entries: 3
current id: 1
last crash: 1
head 0: 0x90000002
tail 0: 0x90000002
size 0: 0x1
head 1: 0x90000001 <----
tail 1: 0x90000000
size 1: 0x2
transaction: 0x0
-------------------------
Entry at 0xa0010002
hash: 0x687d1422
next entry: 0x0
rankings: 0x90000000
key length: 13
key: "the first key"
key addr: 0x0
reuse count: 1
----------
Rankings at 0x90000000
next: 0x90000000
prev: 0x90000001
entry: 0xa0010002
dirty: 0
----------
Entry at 0xa0010003
hash: 0x4a70620e
next entry: 0x0
rankings: 0x90000001
key length: 14
key: "the second key"
key addr: 0x0
reuse count: 0 <---- list 0
----------
Rankings at 0x90000001
next: 0x90000000
prev: 0x90000001 <----- head
entry: 0xa0010003
dirty: 1 <----- This was actually inserted on list 1
----------
Entry at 0xa0010004
hash: 0x63909ecb
next entry: 0x0
rankings: 0x90000002
key length: 14
key: "some other key"
key addr: 0x0
reuse count: 0
----------
Rankings at 0x90000002
next: 0x90000002
prev: 0x90000002
entry: 0xa0010004
dirty: 0
----------
================================
Generated with:
SetNewEviction();
SetMaxSize(20 * 1024 * 1024);
InitCache();
const char* kName1 = "the first key";
const char* kName2 = "the second key";
disk_cache::Entry* entry;
ASSERT_EQ(net::OK, CreateEntry(kName1, &entry));
entry->Close();
ASSERT_EQ(net::OK, CreateEntry(kName2, &entry));
entry->Close();
ASSERT_EQ(net::OK, CreateEntry("some other key", &entry));
entry->Close();
ASSERT_EQ(net::OK, OpenEntry(kName1, &entry));
entry->Close();
ASSERT_EQ(net::OK, OpenEntry(kName2, &entry));
Set a breakpoint on that last line, and when the entry is moved from one list to another, crash the process:
rankings_->Remove(entry->rankings(), Rankings::NO_USE);
rankings_->Insert(entry->rankings(), false, Rankings::LOW_USE);
entry->entry()->Store(); <---- crash here