From: Simon McVittie Date: Thu, 26 Oct 2017 12:08:15 +0100 Subject: lib/utils: Check for invalid UTF-8 in filenames In case a filename contains invalid UTF-8 characters, libostree will pass it to g_variant_builder_add() in create_tree_variant_from_hashes() anyway, which leads to a critical warning from glib and an invalid commit. This commit makes ostree print a useful error and exit instead. Closes: #1271 Approved by: cgwalters Origin: upstream, 2017.13, commit:2a9c5efe1d10b79681b0ee638994ead375be6597 --- src/libotutil/ot-unix-utils.c | 2 ++ tests/basic-test.sh | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/libotutil/ot-unix-utils.c b/src/libotutil/ot-unix-utils.c index d6c5ee6..1446cde 100644 --- a/src/libotutil/ot-unix-utils.c +++ b/src/libotutil/ot-unix-utils.c @@ -50,6 +50,8 @@ ot_util_filename_validate (const char *name, { return glnx_throw (error, "Invalid / in filename %s", name); } + if (!g_utf8_validate (name, -1, NULL)) + return glnx_throw (error, "Invalid UTF-8 in filename %s", name); return TRUE; } diff --git a/tests/basic-test.sh b/tests/basic-test.sh index a01f437..52bbe52 100644 --- a/tests/basic-test.sh +++ b/tests/basic-test.sh @@ -19,7 +19,7 @@ set -euo pipefail -echo "1..$((73 + ${extra_basic_tests:-0}))" +echo "1..$((74 + ${extra_basic_tests:-0}))" CHECKOUT_U_ARG="" CHECKOUT_H_ARGS="-H" @@ -334,6 +334,14 @@ echo "ok commit from ref with modifier" $OSTREE commit ${COMMIT_ARGS} -b trees/test2 -s 'ref with / in it' --tree=ref=test2 echo "ok commit ref with /" +mkdir badutf8 +echo "invalid utf8 filename" > badutf8/$(printf '\x80') +if $OSTREE commit ${COMMIT_ARGS} -b badutf8 --tree=dir=badutf8 2>err.txt; then + assert_not_reached "commit filename with invalid UTF-8" +fi +assert_file_has_content err.txt "Invalid UTF-8 in filename" +echo "ok commit bad UTF-8" + old_rev=$($OSTREE rev-parse test2) $OSTREE ls -R -C test2 $OSTREE commit ${COMMIT_ARGS} --skip-if-unchanged -b trees/test2 -s 'should not be committed' --tree=ref=test2