From 86963334bdef83ddd9f55dda33e3b681851b9cc5 Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Mon, 8 May 2017 16:59:14 -0400 Subject: [PATCH] fsck: Check for refs missing corresponding commit Just doing this one quickly since it was easy. Closes: https://github.com/ostreedev/ostree/issues/831 Closes: #841 Approved by: jlebon --- src/ostree/ot-builtin-fsck.c | 22 ++++++++++++++++++++++ tests/test-corruption.sh | 17 ++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/ostree/ot-builtin-fsck.c b/src/ostree/ot-builtin-fsck.c index 2f154cff..7519d6db 100644 --- a/src/ostree/ot-builtin-fsck.c +++ b/src/ostree/ot-builtin-fsck.c @@ -246,6 +246,7 @@ ostree_builtin_fsck (int argc, char **argv, GCancellable *cancellable, GError ** gpointer key, value; gboolean found_corruption = FALSE; guint n_partial = 0; + g_autoptr(GHashTable) all_refs = NULL; g_autoptr(GHashTable) objects = NULL; g_autoptr(GHashTable) commits = NULL; g_autoptr(GPtrArray) tombstones = NULL; @@ -254,6 +255,27 @@ ostree_builtin_fsck (int argc, char **argv, GCancellable *cancellable, GError ** if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) goto out; + if (!opt_quiet) + g_print ("Validating refs...\n"); + + /* Validate that the commit for each ref is available */ + if (!ostree_repo_list_refs (repo, NULL, &all_refs, + cancellable, error)) + return FALSE; + g_hash_table_iter_init (&hash_iter, all_refs); + while (g_hash_table_iter_next (&hash_iter, &key, &value)) + { + const char *refname = key; + const char *checksum = value; + g_autoptr(GVariant) commit = NULL; + if (!ostree_repo_load_variant (repo, OSTREE_OBJECT_TYPE_COMMIT, + checksum, &commit, error)) + { + g_prefix_error (error, "Loading commit for ref %s: ", refname); + goto out; + } + } + if (!opt_quiet) g_print ("Enumerating objects...\n"); diff --git a/tests/test-corruption.sh b/tests/test-corruption.sh index ef0e94ef..8e2aba56 100755 --- a/tests/test-corruption.sh +++ b/tests/test-corruption.sh @@ -19,10 +19,12 @@ set -euo pipefail -echo "1..2" +echo "1..3" . $(dirname $0)/libtest.sh +cd ${test_tmpdir} +rm repo files -rf setup_test_repository "bare" $OSTREE checkout test2 checkout-test2 cd checkout-test2 @@ -34,6 +36,8 @@ $OSTREE fsck -q echo "ok chmod" cd ${test_tmpdir} +rm repo files -rf +setup_test_repository "bare" rm checkout-test2 -rf $OSTREE checkout test2 checkout-test2 cd checkout-test2 @@ -41,3 +45,14 @@ chmod o+x firstfile $OSTREE fsck -q --delete && (echo 1>&2 "fsck unexpectedly succeeded"; exit 1) echo "ok chmod" + +cd ${test_tmpdir} +rm repo files -rf +setup_test_repository "bare" +find repo/ -name '*.commit' -delete +if $OSTREE fsck -q 2>err.txt; then + assert_not_reached "fsck unexpectedly succeeded" +fi +assert_file_has_content_literal err.txt "Loading commit for ref test2: No such metadata object" + +echo "ok missing commit"