xfs: validate unicode filesystem labels
authorDarrick J. Wong <darrick.wong@oracle.com>
Mon, 20 May 2019 22:31:21 +0000 (15:31 -0700)
committerEryu Guan <guaneryu@gmail.com>
Sun, 26 May 2019 06:24:48 +0000 (14:24 +0800)
Make sure we can set and retrieve unicode labels, including emoji.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eryu Guan <guaneryu@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
common/rc
tests/generic/453
tests/generic/454
tests/xfs/504 [new file with mode: 0755]
tests/xfs/504.out [new file with mode: 0644]
tests/xfs/group

index f577e5e3b9d3d06ba98b31b90f1b1720fa1e86e1..17b89d5d8519471ebaf2089401a923d877e924e5 100644 (file)
--- a/common/rc
+++ b/common/rc
@@ -4014,6 +4014,24 @@ _try_wipe_scratch_devs()
        done
 }
 
+# Only run this on xfs if xfs_scrub is available and has the unicode checker
+_check_xfs_scrub_does_unicode() {
+       [ "${FSTYP}" == "xfs" ] || return 1
+
+       local mount="$1"
+       local dev="$2"
+
+       _supports_xfs_scrub "${mount}" "${dev}" || return 1
+
+       # We only care if xfs_scrub has unicode string support...
+       if ! type ldd > /dev/null 2>&1 || \
+          ! ldd "${XFS_SCRUB_PROG}" | grep -q libicui18n; then
+               return 1
+       fi
+
+       return 0
+}
+
 init_rc
 
 ################################################################################
index 2396d62c5cecfa5fd121172baac9f35aab634bc8..7dbadb0286fc09553f215f9b4598f72cc03b6756 100755 (executable)
@@ -219,21 +219,7 @@ done
 
 echo "Test XFS online scrub, if applicable"
 
-# Only run this on xfs if xfs_scrub is available and has the unicode checker
-check_xfs_scrub() {
-       [ "$FSTYP" == "xfs" ] || return 1
-       _supports_xfs_scrub "$SCRATCH_MNT" "$SCRATCH_DEV" || return 1
-
-       # We only care if xfs_scrub has unicode string support...
-       if ! type ldd > /dev/null 2>&1 || \
-          ! ldd "${XFS_SCRUB_PROG}" | grep -q libicui18n; then
-               return 1
-       fi
-
-       return 0
-}
-
-if check_xfs_scrub; then
+if _check_xfs_scrub_does_unicode "$SCRATCH_MNT" "$SCRATCH_DEV"; then
        output="$(LC_ALL="C.UTF-8" ${XFS_SCRUB_PROG} -v -n "${SCRATCH_MNT}" 2>&1 | filter_scrub)"
        echo "${output}" | grep -q "french_" || echo "No complaints about french e accent?"
        echo "${output}" | grep -q "greek_" || echo "No complaints about greek letter mess?"
index 01986d6be9d20a240cb248d795170ec25c6ccbfe..96a0ea28ac9a67fb51c8ccadf0d0eeedaf698e17 100755 (executable)
@@ -186,21 +186,7 @@ test "${crazy_keys}" -ne "${expected_keys}" && echo "Expected ${expected_keys} k
 
 echo "Test XFS online scrub, if applicable"
 
-# Only run this on xfs if xfs_scrub is available and has the unicode checker
-check_xfs_scrub() {
-       [ "$FSTYP" == "xfs" ] || return 1
-       _supports_xfs_scrub "$SCRATCH_MNT" "$SCRATCH_DEV" || return 1
-
-       # We only care if xfs_scrub has unicode string support...
-       if ! type ldd > /dev/null 2>&1 || \
-          ! ldd "${XFS_SCRUB_PROG}" | grep -q libicui18n; then
-               return 1
-       fi
-
-       return 0
-}
-
-if check_xfs_scrub; then
+if _check_xfs_scrub_does_unicode "$SCRATCH_MNT" "$SCRATCH_DEV"; then
        output="$(LC_ALL="C.UTF-8" ${XFS_SCRUB_PROG} -v -n "${SCRATCH_MNT}" 2>&1 | filter_scrub)"
        echo "${output}" | grep -q "french_" || echo "No complaints about french e accent?"
        echo "${output}" | grep -q "greek_" || echo "No complaints about greek letter mess?"
diff --git a/tests/xfs/504 b/tests/xfs/504
new file mode 100755 (executable)
index 0000000..cc6088d
--- /dev/null
@@ -0,0 +1,153 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright (c) 2019, Oracle and/or its affiliates.  All Rights Reserved.
+#
+# FS QA Test No. 504
+#
+# Create a directory with multiple filenames that all appear the same
+# (in unicode, anyway) but point to different inodes.  In theory all
+# Linux filesystems should allow this (filenames are a sequence of
+# arbitrary bytes) even if the user implications are horrifying.
+#
+seq=`basename "$0"`
+seqres="$RESULT_DIR/$seq"
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1    # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_cleanup()
+{
+       cd /
+       rm -f $tmp.*
+}
+
+# get standard environment, filters and checks
+. ./common/rc
+. ./common/filter
+
+_supported_os Linux
+_supported_fs xfs
+_require_scratch_nocheck
+_require_xfs_io_command 'label'
+
+echo "Silence is golden."
+
+want_scrub=
+_check_xfs_scrub_does_unicode "$SCRATCH_MNT" "$SCRATCH_DEV" && want_scrub=yes
+
+filter_scrub() {
+       grep 'Unicode' | sed -e 's/^.*Duplicate/Duplicate/g'
+}
+
+maybe_scrub() {
+       test "$want_scrub" = "yes" || return
+
+       output="$(LC_ALL="C.UTF-8" ${XFS_SCRUB_PROG} -v -n "${SCRATCH_MNT}" 2>&1)"
+       echo "xfs_scrub output:" >> $seqres.full
+       echo "$output" >> $seqres.full
+       echo "$output" >> $tmp.scrub
+}
+
+testlabel() {
+       local label="$(echo -e "$1")"
+       local expected_label="label = \"$label\""
+
+       echo "Formatting label '$1'." >> $seqres.full
+       # First, let's see if we can recover the label when we set it
+       # with mkfs.
+       _scratch_mkfs -L "$label" >> $seqres.full 2>&1
+       _scratch_mount >> $seqres.full 2>&1
+       blkid -s LABEL $SCRATCH_DEV | _filter_scratch | sed -e "s/ $//g" >> $seqres.full
+       blkid -d -s LABEL $SCRATCH_DEV | _filter_scratch | sed -e "s/ $//g" >> $seqres.full
+
+       # Did it actually stick?
+       local actual_label="$($XFS_IO_PROG -c label $SCRATCH_MNT)"
+       echo "$actual_label" >> $seqres.full
+
+       if [ "${actual_label}" != "${expected_label}" ]; then
+               echo "Saw '${expected_label}', expected '${actual_label}'."
+       fi
+       maybe_scrub
+       _scratch_unmount
+
+       # Now let's try setting the label online to see what happens.
+       echo "Setting label '$1'." >> $seqres.full
+       _scratch_mkfs >> $seqres.full 2>&1
+       _scratch_mount >> $seqres.full 2>&1
+       $XFS_IO_PROG -c "label -s $label" $SCRATCH_MNT >> $seqres.full
+       blkid -s LABEL $SCRATCH_DEV | _filter_scratch | sed -e "s/ $//g" >> $seqres.full
+       blkid -d -s LABEL $SCRATCH_DEV | _filter_scratch | sed -e "s/ $//g" >> $seqres.full
+       _scratch_cycle_mount
+
+       # Did it actually stick?
+       local actual_label="$($XFS_IO_PROG -c label $SCRATCH_MNT)"
+       echo "$actual_label" >> $seqres.full
+
+       if [ "${actual_label}" != "${expected_label}" ]; then
+               echo "Saw '${expected_label}'; expected '${actual_label}'."
+       fi
+       maybe_scrub
+       _scratch_unmount
+}
+
+# Simple test
+testlabel "simple"
+
+# Two different renderings of the same label
+testlabel "caf\xc3\xa9.fs"
+testlabel "cafe\xcc\x81.fs"
+
+# Arabic code point can expand into a muuuch longer series
+testlabel "xfs_\xef\xb7\xba.fs"
+
+# Fake slash?
+testlabel "urk\xc0\xafmoo"
+
+# Emoji: octopus butterfly owl giraffe
+testlabel "\xf0\x9f\xa6\x91\xf0\x9f\xa6\x8b\xf0\x9f\xa6\x89"
+
+# unicode rtl widgets too...
+testlabel "mo\xe2\x80\xaegnp.txt"
+testlabel "motxt.png"
+
+# mixed-script confusables
+testlabel "mixed_t\xce\xbfp"
+testlabel "mixed_top"
+
+# single-script spoofing
+testlabel "a\xe2\x80\x90b.fs"
+testlabel "a-b.fs"
+
+testlabel "dz_dze.fs"
+testlabel "dz_\xca\xa3e.fs"
+
+# symbols
+testlabel "_Rs.fs"
+testlabel "_\xe2\x82\xa8.fs"
+
+# zero width joiners
+testlabel "moocow.fs"
+testlabel "moo\xe2\x80\x8dcow.fs"
+
+# combining marks
+testlabel "\xe1\x80\x9c\xe1\x80\xad\xe1\x80\xaf.fs"
+testlabel "\xe1\x80\x9c\xe1\x80\xaf\xe1\x80\xad.fs"
+
+# fake dotdot entry
+testlabel ".\xe2\x80\x8d"
+testlabel "..\xe2\x80\x8d"
+
+# Did scrub choke on anything?
+if [ "$want_scrub" = "yes" ]; then
+       grep -q "^Warning.*gnp.txt.*suspicious text direction" $tmp.scrub || \
+               echo "No complaints about direction overrides?"
+       grep -q "^Warning.*control characters" $tmp.scrub || \
+               echo "No complaints about control characters?"
+fi
+
+# success, all done
+status=0
+exit
diff --git a/tests/xfs/504.out b/tests/xfs/504.out
new file mode 100644 (file)
index 0000000..3f8c085
--- /dev/null
@@ -0,0 +1,2 @@
+QA output created by 504
+Silence is golden.
index e71b058f694adcb9bc13b07ca30daccdeb4b05b1..144b2fc5ed5d9218920df83f763746bbd051711c 100644 (file)
 501 auto quick unlink
 502 auto quick unlink
 503 auto copy metadump
+504 auto quick mkfs label