u32 total = le32_to_cpu(regf->total_hbin_size);
u32 offs = le32_to_cpu(offset);
const struct cell *cell;
- s32 actual_size;
+ u32 actual_size;
if ((offs > total) || (offs & 7) || (wanted_size > total - offs))
return NULL;
cell = (const struct cell *)®f->hbin_area[offs];
- actual_size = le32_to_cpu(cell->size);
- if (actual_size >= 0) /* Cell not in use? */
+ actual_size = -le32_to_cpu(cell->size);
+ if (actual_size > INT32_MAX) /* Cell unused, or size was INT32_MIN? */
return NULL;
- if (wanted_size > -actual_size) /* Cell too small? */
+ if (wanted_size > actual_size) /* Cell too small? */
return NULL;
return cell;
}
unsigned num_offsets;
size_t extra_size;
unsigned increment;
- const le32 *p;
+ size_t i = 0;
enum hive_status status;
if (stats->levels_remaining == 0 || stats->subkey_lists_remaining == 0)
sizeof(struct subkey_list) + extra_size))
return HIVE_CORRUPT;
- p = list->elements;
-
switch (list->base.magic) {
case LF_MAGIC:
case LH_MAGIC:
while (num_offsets--) {
const struct nk *sub_nk;
- sub_nk = get_cell_pointer(regf, *p, sizeof(struct nk));
+ sub_nk = get_cell_pointer(regf, list->elements[i],
+ sizeof(struct nk));
if (!sub_nk || sub_nk->base.magic != NK_MAGIC)
return HIVE_CORRUPT;
- if (!revalidate_cell(regf, *p, sizeof(struct nk) +
+ if (!revalidate_cell(regf, list->elements[i],
+ sizeof(struct nk) +
le16_to_cpu(sub_nk->name_size)))
return HIVE_CORRUPT;
status = (*cb)(sub_nk, cb_ctx);
if (status != HIVE_OK)
return status;
- p += increment;
+ i += increment;
}
return HIVE_OK;
case RI_MAGIC:
status = HIVE_OK;
stats->levels_remaining--;
while (num_offsets--) {
- status = iterate_subkeys_recursive(regf, *p++,
- cb, cb_ctx, stats);
+ status = iterate_subkeys_recursive(regf,
+ list->elements[i++],
+ cb, cb_ctx, stats);
if (status != HIVE_OK)
break;
}
if (names_equal(ctx->key_name, ctx->key_name_nchars,
sub_nk->name, le16_to_cpu(sub_nk->name_size),
- (sub_nk->flags & NK_COMPRESSED_NAME)))
+ (sub_nk->flags & NK_COMPRESSED_NAME) != 0))
{
ctx->result = sub_nk;
return HIVE_ITERATION_STOPPED;
if (names_equal(value_uname, value_uname_nchars,
vk->name, name_size,
- (vk->flags & VK_COMPRESSED_NAME)))
+ (vk->flags & VK_COMPRESSED_NAME) != 0))
{
*vk_ret = vk;
status = HIVE_OK;
subkey[i] = sub_nk->name[i];
subkey[name_size] = '\0';
} else {
- size_t dummy;
enum hive_status status;
status = translate_wimlib_error(
utf16le_to_tstr((utf16lechar *)sub_nk->name,
- name_size, &subkey, &dummy));
+ name_size, &subkey, NULL));
if (status != HIVE_OK)
return status;
}