#! /bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (c) 2022 Oracle. All Rights Reserved. # # FS QA Test No. 543 # # Regression test for xfsprogs commit: # # 99c78777 ("mkfs: prevent corruption of passed-in suboption string values") # . ./common/preamble _begin_fstest auto quick mkfs _cleanup() { rm -f $TEST_DIR/fubar.img cd / rm -r -f $tmp.* } # Import common functions. # . ./common/filter # real QA test starts here # Modify as appropriate. _supported_fs xfs _require_test _require_xfs_mkfs_cfgfile # Set up a configuration file with an exact block size and log stripe unit # so that mkfs won't complain about having to correct the log stripe unit # size that is implied by the provided data device stripe unit. cfgfile=$tmp.cfg cat << EOF >> $tmp.cfg [block] size=4096 [data] su=2097152 sw=1 EOF # Some mkfs options store the user's value string for processing after certain # geometry parameters (e.g. the fs block size) have been settled. This is how # the su= option can accept arguments such as "8b" to mean eight filesystem # blocks. # # Unfortunately, on Ubuntu 20.04, the libini parser uses an onstack char[] # array to store value that it parse, and it passes the address of this array # to the parse_cfgopt. The getstr function returns its argument, which is # stored in the cli_params structure by the D_SU parsing code. By the time we # get around to interpreting this string, of course, the stack array has long # since lost scope and is now full of garbage. If we're lucky, the value will # cause a number interpretation failure. If not, the fs is configured with # garbage geometry. # # Either way, set up a config file to exploit this vulnerability so that we # can prove that current mkfs works correctly. $XFS_IO_PROG -f -c "truncate 1g" $TEST_DIR/fubar.img options=(-c options=$cfgfile -l sunit=8 -f -N $TEST_DIR/fubar.img) $MKFS_XFS_PROG "${options[@]}" >> $seqres.full || echo "mkfs failed" # success, all done echo Silence is golden status=0 exit