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