1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun 4*4882a593Smuzhiyunefivarfs_mount=/sys/firmware/efi/efivars 5*4882a593Smuzhiyuntest_guid=210be57c-9849-4fc7-a635-e6382d1aec27 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun# Kselftest framework requirement - SKIP code is 4. 8*4882a593Smuzhiyunksft_skip=4 9*4882a593Smuzhiyun 10*4882a593Smuzhiyunfile_cleanup() 11*4882a593Smuzhiyun{ 12*4882a593Smuzhiyun chattr -i $1 13*4882a593Smuzhiyun rm -f $1 14*4882a593Smuzhiyun} 15*4882a593Smuzhiyun 16*4882a593Smuzhiyuncheck_prereqs() 17*4882a593Smuzhiyun{ 18*4882a593Smuzhiyun local msg="skip all tests:" 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun if [ $UID != 0 ]; then 21*4882a593Smuzhiyun echo $msg must be run as root >&2 22*4882a593Smuzhiyun exit $ksft_skip 23*4882a593Smuzhiyun fi 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun if ! grep -q "^\S\+ $efivarfs_mount efivarfs" /proc/mounts; then 26*4882a593Smuzhiyun echo $msg efivarfs is not mounted on $efivarfs_mount >&2 27*4882a593Smuzhiyun exit $ksft_skip 28*4882a593Smuzhiyun fi 29*4882a593Smuzhiyun} 30*4882a593Smuzhiyun 31*4882a593Smuzhiyunrun_test() 32*4882a593Smuzhiyun{ 33*4882a593Smuzhiyun local test="$1" 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun echo "--------------------" 36*4882a593Smuzhiyun echo "running $test" 37*4882a593Smuzhiyun echo "--------------------" 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun if [ "$(type -t $test)" = 'function' ]; then 40*4882a593Smuzhiyun ( $test ) 41*4882a593Smuzhiyun else 42*4882a593Smuzhiyun ( ./$test ) 43*4882a593Smuzhiyun fi 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun if [ $? -ne 0 ]; then 46*4882a593Smuzhiyun echo " [FAIL]" 47*4882a593Smuzhiyun rc=1 48*4882a593Smuzhiyun else 49*4882a593Smuzhiyun echo " [PASS]" 50*4882a593Smuzhiyun fi 51*4882a593Smuzhiyun} 52*4882a593Smuzhiyun 53*4882a593Smuzhiyuntest_create() 54*4882a593Smuzhiyun{ 55*4882a593Smuzhiyun local attrs='\x07\x00\x00\x00' 56*4882a593Smuzhiyun local file=$efivarfs_mount/$FUNCNAME-$test_guid 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun printf "$attrs\x00" > $file 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun if [ ! -e $file ]; then 61*4882a593Smuzhiyun echo "$file couldn't be created" >&2 62*4882a593Smuzhiyun exit 1 63*4882a593Smuzhiyun fi 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun if [ $(stat -c %s $file) -ne 5 ]; then 66*4882a593Smuzhiyun echo "$file has invalid size" >&2 67*4882a593Smuzhiyun file_cleanup $file 68*4882a593Smuzhiyun exit 1 69*4882a593Smuzhiyun fi 70*4882a593Smuzhiyun file_cleanup $file 71*4882a593Smuzhiyun} 72*4882a593Smuzhiyun 73*4882a593Smuzhiyuntest_create_empty() 74*4882a593Smuzhiyun{ 75*4882a593Smuzhiyun local file=$efivarfs_mount/$FUNCNAME-$test_guid 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun : > $file 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun if [ ! -e $file ]; then 80*4882a593Smuzhiyun echo "$file can not be created without writing" >&2 81*4882a593Smuzhiyun exit 1 82*4882a593Smuzhiyun fi 83*4882a593Smuzhiyun file_cleanup $file 84*4882a593Smuzhiyun} 85*4882a593Smuzhiyun 86*4882a593Smuzhiyuntest_create_read() 87*4882a593Smuzhiyun{ 88*4882a593Smuzhiyun local file=$efivarfs_mount/$FUNCNAME-$test_guid 89*4882a593Smuzhiyun ./create-read $file 90*4882a593Smuzhiyun file_cleanup $file 91*4882a593Smuzhiyun} 92*4882a593Smuzhiyun 93*4882a593Smuzhiyuntest_delete() 94*4882a593Smuzhiyun{ 95*4882a593Smuzhiyun local attrs='\x07\x00\x00\x00' 96*4882a593Smuzhiyun local file=$efivarfs_mount/$FUNCNAME-$test_guid 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun printf "$attrs\x00" > $file 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun if [ ! -e $file ]; then 101*4882a593Smuzhiyun echo "$file couldn't be created" >&2 102*4882a593Smuzhiyun exit 1 103*4882a593Smuzhiyun fi 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun file_cleanup $file 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun if [ -e $file ]; then 108*4882a593Smuzhiyun echo "$file couldn't be deleted" >&2 109*4882a593Smuzhiyun exit 1 110*4882a593Smuzhiyun fi 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun} 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun# test that we can remove a variable by issuing a write with only 115*4882a593Smuzhiyun# attributes specified 116*4882a593Smuzhiyuntest_zero_size_delete() 117*4882a593Smuzhiyun{ 118*4882a593Smuzhiyun local attrs='\x07\x00\x00\x00' 119*4882a593Smuzhiyun local file=$efivarfs_mount/$FUNCNAME-$test_guid 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun printf "$attrs\x00" > $file 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun if [ ! -e $file ]; then 124*4882a593Smuzhiyun echo "$file does not exist" >&2 125*4882a593Smuzhiyun exit 1 126*4882a593Smuzhiyun fi 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun chattr -i $file 129*4882a593Smuzhiyun printf "$attrs" > $file 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun if [ -e $file ]; then 132*4882a593Smuzhiyun echo "$file should have been deleted" >&2 133*4882a593Smuzhiyun exit 1 134*4882a593Smuzhiyun fi 135*4882a593Smuzhiyun} 136*4882a593Smuzhiyun 137*4882a593Smuzhiyuntest_open_unlink() 138*4882a593Smuzhiyun{ 139*4882a593Smuzhiyun local file=$efivarfs_mount/$FUNCNAME-$test_guid 140*4882a593Smuzhiyun ./open-unlink $file 141*4882a593Smuzhiyun} 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun# test that we can create a range of filenames 144*4882a593Smuzhiyuntest_valid_filenames() 145*4882a593Smuzhiyun{ 146*4882a593Smuzhiyun local attrs='\x07\x00\x00\x00' 147*4882a593Smuzhiyun local ret=0 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun local file_list="abc dump-type0-11-1-1362436005 1234 -" 150*4882a593Smuzhiyun for f in $file_list; do 151*4882a593Smuzhiyun local file=$efivarfs_mount/$f-$test_guid 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun printf "$attrs\x00" > $file 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun if [ ! -e $file ]; then 156*4882a593Smuzhiyun echo "$file could not be created" >&2 157*4882a593Smuzhiyun ret=1 158*4882a593Smuzhiyun else 159*4882a593Smuzhiyun file_cleanup $file 160*4882a593Smuzhiyun fi 161*4882a593Smuzhiyun done 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun exit $ret 164*4882a593Smuzhiyun} 165*4882a593Smuzhiyun 166*4882a593Smuzhiyuntest_invalid_filenames() 167*4882a593Smuzhiyun{ 168*4882a593Smuzhiyun local attrs='\x07\x00\x00\x00' 169*4882a593Smuzhiyun local ret=0 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun local file_list=" 172*4882a593Smuzhiyun -1234-1234-1234-123456789abc 173*4882a593Smuzhiyun foo 174*4882a593Smuzhiyun foo-bar 175*4882a593Smuzhiyun -foo- 176*4882a593Smuzhiyun foo-barbazba-foob-foob-foob-foobarbazfoo 177*4882a593Smuzhiyun foo------------------------------------- 178*4882a593Smuzhiyun -12345678-1234-1234-1234-123456789abc 179*4882a593Smuzhiyun a-12345678=1234-1234-1234-123456789abc 180*4882a593Smuzhiyun a-12345678-1234=1234-1234-123456789abc 181*4882a593Smuzhiyun a-12345678-1234-1234=1234-123456789abc 182*4882a593Smuzhiyun a-12345678-1234-1234-1234=123456789abc 183*4882a593Smuzhiyun 1112345678-1234-1234-1234-123456789abc" 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun for f in $file_list; do 186*4882a593Smuzhiyun local file=$efivarfs_mount/$f 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun printf "$attrs\x00" 2>/dev/null > $file 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun if [ -e $file ]; then 191*4882a593Smuzhiyun echo "Creating $file should have failed" >&2 192*4882a593Smuzhiyun file_cleanup $file 193*4882a593Smuzhiyun ret=1 194*4882a593Smuzhiyun fi 195*4882a593Smuzhiyun done 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun exit $ret 198*4882a593Smuzhiyun} 199*4882a593Smuzhiyun 200*4882a593Smuzhiyuncheck_prereqs 201*4882a593Smuzhiyun 202*4882a593Smuzhiyunrc=0 203*4882a593Smuzhiyun 204*4882a593Smuzhiyunrun_test test_create 205*4882a593Smuzhiyunrun_test test_create_empty 206*4882a593Smuzhiyunrun_test test_create_read 207*4882a593Smuzhiyunrun_test test_delete 208*4882a593Smuzhiyunrun_test test_zero_size_delete 209*4882a593Smuzhiyunrun_test test_open_unlink 210*4882a593Smuzhiyunrun_test test_valid_filenames 211*4882a593Smuzhiyunrun_test test_invalid_filenames 212*4882a593Smuzhiyun 213*4882a593Smuzhiyunexit $rc 214