#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2023 CTERA Networks. All Rights Reserved.
#
# FS QA Test 083
#
# Test regressions in parsing and display of special chars in mount options.
#
# The following kernel commits from v6.5 introduced regressions:
#  b36a5780cb44 ("ovl: modify layer parameter parsing")
#  1784fbc2ed9c ("ovl: port to new mount api")
#

. ./common/preamble
_begin_fstest auto quick mount

# Import common functions.
. ./common/filter

_fixed_by_kernel_commit 32db51070850 \
	"ovl: fix regression in showing lowerdir mount option"
_fixed_by_kernel_commit c34706acf40b \
	"ovl: fix regression in parsing of mount options with escaped comma"

# _overlay_check_* helpers do not handle special chars well
_require_scratch_nocheck

# Remove all files from previous tests
_scratch_mkfs

# Create lowerdirs with special characters
lowerdir_spaces="$OVL_BASE_SCRATCH_MNT/lower1 with  spaces"
lowerdir_colons="$OVL_BASE_SCRATCH_MNT/lower2:with::colons"
lowerdir_commas="$OVL_BASE_SCRATCH_MNT/lower3,with,,commas"
lowerdir_colons_esc="$OVL_BASE_SCRATCH_MNT/lower2\:with\:\:colons"
lowerdir_commas_esc="$OVL_BASE_SCRATCH_MNT/lower3\,with\,\,commas"
upperdir=$OVL_BASE_SCRATCH_MNT/$OVL_UPPER
workdir=$OVL_BASE_SCRATCH_MNT/$OVL_WORK
mkdir -p "$lowerdir_spaces" "$lowerdir_colons" "$lowerdir_commas"

# _overlay_mount_* helpers do not handle special chars well, so execute mount directly.
# if escaped colons are not parsed correctly, mount will fail.
$MOUNT_PROG -t overlay ovl_esc_test $SCRATCH_MNT \
	-o"upperdir=$upperdir,workdir=$workdir" \
	-o"lowerdir=$lowerdir_colons_esc:$lowerdir_spaces" \
	2>&1 | tee -a $seqres.full

# if spaces are not escaped when showing mount options,
# mount command will not show the word 'spaces' after the spaces
$MOUNT_PROG -t overlay | grep ovl_esc_test  | tee -a $seqres.full | grep -v spaces && \
	echo "ERROR: escaped spaces truncated from lowerdir mount option"

# Re-create the upper/work dirs to mount them with a different lower
# This is required in case index feature is enabled
$UMOUNT_PROG $SCRATCH_MNT
rm -rf "$upperdir" "$workdir"
mkdir -p "$upperdir" "$workdir"

# Kernel commit c34706acf40b fixes parsing of mount options with escaped comma
# when the mount options string is provided via data argument to mount(2) syscall.
# With libmount >= 2.39, libmount itself will try to split the comma separated
# options list provided to mount(8) commnad line and call fsconfig(2) for each
# mount option seperately.  Since libmount does not obay to overlayfs escaped
# commas format, it will call fsconfig(2) with the wrong path (i.e. ".../lower3")
# and this test will fail, but the failure would indicate a libmount issue, not
# a kernel issue.  Therefore, force libmount to use mount(2) syscall, so we only
# test the kernel fix.
LIBMOUNT_FORCE_MOUNT2=always $MOUNT_PROG -t overlay $OVL_BASE_SCRATCH_DEV $SCRATCH_MNT \
	-o"upperdir=$upperdir,workdir=$workdir,lowerdir=$lowerdir_commas_esc" 2>> $seqres.full || \
	echo "ERROR: incorrect parsing of escaped comma in lowerdir mount option"

echo "Silence is golden"
status=0
exit
