Skip to content

Commit

Permalink
link_inode: handle hash collisions in DIR_ITEM
Browse files Browse the repository at this point in the history
  • Loading branch information
maharmstone committed Dec 30, 2020
1 parent ed0b61c commit e890b85
Showing 1 changed file with 28 additions and 1 deletion.
29 changes: 28 additions & 1 deletion src/ntfs2btrfs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1307,7 +1307,34 @@ static void link_inode(root& r, uint64_t inode, uint64_t dir, const string_view&

hash = calc_crc32c(0xfffffffe, (const uint8_t*)name.data(), (uint32_t)name.length());

add_item(r, dir, TYPE_DIR_ITEM, hash, di, (uint16_t)dilen); // FIXME - handle hash collisions
if (r.items.count(KEY{dir, TYPE_DIR_ITEM, hash}) == 0)
add_item(r, dir, TYPE_DIR_ITEM, hash, di, (uint16_t)dilen);
else { // hash collision
auto& ent = r.items.at(KEY{dir, TYPE_DIR_ITEM, hash});

if (ent.len != 0) {
void* data = malloc(ent.len + dilen);

if (!data)
throw bad_alloc();

memcpy(data, ent.data, ent.len);
memcpy((uint8_t*)data + ent.len, di, dilen);

free(ent.data);

ent.data = data;
ent.len += (uint32_t)dilen;
} else {
ent.data = malloc(dilen);
if (!ent.data)
throw bad_alloc();

ent.len = (uint32_t)dilen;
memcpy(ent.data, di, dilen);
}
}

add_item(r, dir, TYPE_DIR_INDEX, seq, di, (uint16_t)dilen);
} catch (...) {
free(di);
Expand Down

0 comments on commit e890b85

Please sign in to comment.