btrfs-progs: image: use CRC32C reversing instead of brute force to find collisions
Author: Piotr Pawlow <pp@siedziba.pl> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
334d83053a
commit
0e88d6d1d3
15
image/main.c
15
image/main.c
|
@ -447,17 +447,26 @@ static int find_collision_is_suffix_valid(const char *suffix)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int find_collision_brute_force(struct name *val, u32 name_len)
|
static int find_collision_reverse_crc32c(struct name *val, u32 name_len)
|
||||||
{
|
{
|
||||||
unsigned long checksum;
|
unsigned long checksum;
|
||||||
|
unsigned long current_checksum;
|
||||||
int found = 0;
|
int found = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
/* There are no same length collisions of 4 or less bytes */
|
||||||
|
if (name_len <= 4)
|
||||||
|
return 0;
|
||||||
checksum = crc32c(~1, val->val, name_len);
|
checksum = crc32c(~1, val->val, name_len);
|
||||||
|
name_len -= 4;
|
||||||
memset(val->sub, ' ', name_len);
|
memset(val->sub, ' ', name_len);
|
||||||
i = 0;
|
i = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
if (crc32c(~1, val->sub, name_len) == checksum &&
|
current_checksum = crc32c(~1, val->sub, name_len);
|
||||||
|
find_collision_calc_suffix(current_checksum,
|
||||||
|
checksum,
|
||||||
|
val->sub + name_len);
|
||||||
|
if (find_collision_is_suffix_valid(val->sub + name_len) &&
|
||||||
memcmp(val->sub, val->val, val->len)) {
|
memcmp(val->sub, val->val, val->len)) {
|
||||||
found = 1;
|
found = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -524,7 +533,7 @@ static char *find_collision(struct metadump_struct *md, char *name,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
found = find_collision_brute_force(val, name_len);
|
found = find_collision_reverse_crc32c(val, name_len);
|
||||||
|
|
||||||
if (!found) {
|
if (!found) {
|
||||||
warning(
|
warning(
|
||||||
|
|
Loading…
Reference in New Issue