return g_strconcat ("state/", checksum, ".commitpartial", NULL);
}
+gboolean
+_ostree_validate_ref_fragment (const char *fragment,
+ GError **error);
+
+
gboolean
_ostree_validate_bareuseronly_mode (guint32 mode,
const char *checksum,
return ostree_validate_structureof_checksum_string (sha256, error);
}
-#define OSTREE_REF_FRAGMENT_REGEXP "[-._\\w\\d]+"
+/* This used to allow leading - and ., but was changed in
+ * https://github.com/ostreedev/ostree/pull/1286
+ */
+#define OSTREE_REF_FRAGMENT_REGEXP "[\\w\\d][-._\\w\\d]*"
#define OSTREE_REF_REGEXP "(?:" OSTREE_REF_FRAGMENT_REGEXP "/)*" OSTREE_REF_FRAGMENT_REGEXP
#define OSTREE_REMOTE_NAME_REGEXP OSTREE_REF_FRAGMENT_REGEXP
return TRUE;
}
+gboolean
+_ostree_validate_ref_fragment (const char *fragment,
+ GError **error)
+{
+ static GRegex *regex;
+ static gsize regex_initialized;
+ if (g_once_init_enter (®ex_initialized))
+ {
+ regex = g_regex_new ("^" OSTREE_REF_FRAGMENT_REGEXP "$", 0, 0, NULL);
+ g_assert (regex);
+ g_once_init_leave (®ex_initialized, 1);
+ }
+
+ g_autoptr(GMatchInfo) match = NULL;
+ if (!g_regex_match (regex, fragment, 0, &match))
+ return glnx_throw (error, "Invalid ref fragment '%s'", fragment);
+
+ return TRUE;
+}
+
/**
* ostree_validate_rev:
* @rev: A revision string
while (g_variant_iter_loop (collection_refs_iter, "(&s&s&s)", &collection_id, &ref_name, &checksum))
{
+ if (!ostree_validate_rev (ref_name, error))
+ goto out;
g_hash_table_insert (requested_refs_to_fetch,
ostree_collection_ref_new (collection_id, ref_name),
(*checksum != '\0') ? g_strdup (checksum) : NULL);
if (dent == NULL)
break;
+ /* https://github.com/ostreedev/ostree/issues/1285
+ * Ignore any files that don't appear to be valid fragments; e.g.
+ * Red Hat has a tool that drops .rsync_info files into each
+ * directory it syncs.
+ **/
+ if (!_ostree_validate_ref_fragment (dent->d_name, NULL))
+ continue;
+
g_string_append (base_path, dent->d_name);
if (dent->d_type == DT_DIR)
setup_fake_remote_repo1 "archive"
-echo '1..2'
+echo '1..5'
cd ${test_tmpdir}
mkdir repo
assert_not_reached "refs --create unexpectedly succeeded in overwriting an existing prefix!"
fi
+# https://github.com/ostreedev/ostree/issues/1285
+# One tool was creating .latest_rsync files in each dir, let's ignore stuff like
+# that.
+echo '👻' > repo/refs/heads/.spooky_and_hidden
+${CMD_PREFIX} ostree --repo=repo refs > refs.txt
+assert_not_file_has_content refs.txt 'spooky'
+${CMD_PREFIX} ostree --repo=repo refs ctest --create=exampleos/x86_64/standard
+echo '👻' > repo/refs/heads/exampleos/x86_64/.further_spooky_and_hidden
+${CMD_PREFIX} ostree --repo=repo refs > refs.txt
+assert_file_has_content refs.txt 'exampleos/x86_64/standard'
+assert_not_file_has_content refs.txt 'spooky'
+rm repo/refs/heads/exampleos -rf
+echo "ok hidden refs"
+
+for ref in '.' '-' '.foo' '-bar' '!' '!foo'; do
+ if ${CMD_PREFIX} ostree --repo=repo refs ctest --create=${ref} 2>err.txt; then
+ fatal "Created ref ${ref}"
+ fi
+ assert_file_has_content err.txt 'Invalid ref'
+done
+echo "ok invalid refs"
+
+for ref in 'org.foo.bar/x86_64/standard-blah'; do
+ ostree --repo=repo refs ctest --create=${ref}
+ ostree --repo=repo rev-parse ${ref} >/dev/null
+ ostree --repo=repo refs --delete ${ref}
+done
+echo "ok valid refs with chars '._-'"
+
#Check to see if any uncleaned tmp files were created after failed --create
${CMD_PREFIX} ostree --repo=repo refs | wc -l > refscount.create1
assert_file_has_content refscount.create1 "^5$"