On Tue, 2017-02-14 at 14:30 +0000, Richard W.M. Jones wrote:
On Wed, Feb 08, 2017 at 04:36:31PM -0500, Dawid Zamirski wrote:
> There are some corrupted registry files that have invalid hbin
> cells
> but are still readable. This patch makes the following changes:
>
> * hivex_open - do not abort with complete failure if we run across
> a
> block with invalid size (unless it's the root block). Instead
> just
> log the event, and move on. This will allow open hives that have
> apparent invalid blocks but the ones of potential interest might
> be
> perfectly accessible.
> * _hivex_get_children - similiarly, if the's invalid subkey, just
> skip
> it instead of failing so one can continue to browse other valid
> subkeys.
>
> The above is similar to the behavior to Windows regedit where one
> can
> load such corrupted hives with e.g. "reg load HKU\Corrupted" and
> browse/change it despite some keys might be missing.
> ---
> lib/handle.c | 13 +++++++++----
> lib/node.c | 11 +++++------
> 2 files changed, 14 insertions(+), 10 deletions(-)
>
> diff --git a/lib/handle.c b/lib/handle.c
> index 1e122ea..9be3b5f 100644
> --- a/lib/handle.c
> +++ b/lib/handle.c
> @@ -300,10 +300,15 @@ hivex_open (const char *filename, int flags)
> int used;
> seg_len = block_len (h, blkoff, &used);
> if (seg_len <= 4 || (seg_len & 3) != 0) {
> - SET_ERRNO (ENOTSUP,
> - "%s: block size %" PRIi32 " at 0x%zx, bad
> registry",
> - filename, le32toh (block->seg_len), blkoff);
> - goto error;
> + if (is_root) {
> + bad_root_block = 1;
Also I don't like this part where I think it should just exit with
relevant SET_ERRNO message instead of depending on this variable being
checked later in the code.
> + } else {
> + DEBUG(2,
As before, space before parens in function and macro calls.
> @@ -408,7 +407,7 @@ _get_children (hive_h *h, hive_node_h blkoff,
> hive_node_h subkey = le32toh (lf->keys[i].offset);
> subkey += 0x1000;
> if (check_child_is_nk_block (h, subkey, flags) == -1)
> - return -1;
> + continue;
I think this deserves a debug message.
There is also a further call to check_child_is_nk_block in
this function, but if that fails it still returns. Why is
that case different?
Rich.
> if (_hivex_add_to_offset_list (children, subkey) == -1)
> return -1;
> }
> --
> 2.9.3
>
> _______________________________________________
> Libguestfs mailing list
> Libguestfs(a)redhat.com
>
https://www.redhat.com/mailman/listinfo/libguestfs