lib: Validate metadata structure more consistently during pull
authorColin Walters <walters@verbum.org>
Fri, 12 Jan 2018 14:15:21 +0000 (09:15 -0500)
committerAtomic Bot <atomic-devel@projectatomic.io>
Fri, 12 Jan 2018 19:38:34 +0000 (19:38 +0000)
commit8e6e64a5adb69a2cb0e84b035a5bc56009735bc7
treef9276b1d2c0baa1849e8a3125b55d1738f9b4c56
parentf3ae36ff4360c58158963ca2c20862ae94ac0775
lib: Validate metadata structure more consistently during pull

Previously we were doing e.g. `ot_util_filename_validate()` specifically inline
in dirtree objects, but only *after* writing them into the staging directory (by
default). In (non-default) cases such as not using a transaction, such an object
could be written directly into the repo.

A notable gap here is that `pull-local --untrusted` was *not* doing
this verification, just checksums.  We harden that (and also the
static delta writing path, really *everything* that calls
`ostree_repo_write_metadata()` to also do "structure" validation
which includes path traversal checks.  Basically, let's try hard
to avoid having badly structured objects even in the repo.

One thing that sucks in this patch is that we need to allocate a "bounce buffer"
for metadata in the static delta path, because GVariant imposes alignment
requirements, which I screwed up and didn't fulfill when designing deltas. It
actually didn't matter before because we weren't parsing them, but now we are.
In theory we could check alignment but ...eh, not worth it, at least not until
we change the delta compiler to emit aligned metadata which actually may be
quite tricky.  (Big picture I doubt this really matters much right now
but I'm not going to pull out a profiler yet for this)

The pull test was extended to check we didn't even write a dirtree
with path traversal into the staging directory.

There's a bit of code motion in extracting
`_ostree_validate_structureof_metadata()` from `fsck_metadata_object()`.

Then `_ostree_verify_metadata_object()` builds on that to do checksum
verification too.

Closes: #1412
Approved by: jlebon
src/libostree/ostree-core-private.h
src/libostree/ostree-core.c
src/libostree/ostree-repo-commit.c
src/libostree/ostree-repo-pull.c
src/libostree/ostree-repo-static-delta-processing.c
src/libostree/ostree-repo.c
tests/pull-test.sh
tests/test-pull-untrusted.sh