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