1455ce1c7SJeremy Kerr#!/bin/bash
2b2441318SGreg Kroah-Hartman# SPDX-License-Identifier: GPL-2.0
3455ce1c7SJeremy Kerr
4455ce1c7SJeremy Kerrefivarfs_mount=/sys/firmware/efi/efivars
5455ce1c7SJeremy Kerrtest_guid=210be57c-9849-4fc7-a635-e6382d1aec27
6455ce1c7SJeremy Kerr
71f0ea958SShuah Khan (Samsung OSG)# Kselftest framework requirement - SKIP code is 4.
81f0ea958SShuah Khan (Samsung OSG)ksft_skip=4
91f0ea958SShuah Khan (Samsung OSG)
10dff6d2aeSPo-Hsu Linfile_cleanup()
11dff6d2aeSPo-Hsu Lin{
12dff6d2aeSPo-Hsu Lin	chattr -i $1
13dff6d2aeSPo-Hsu Lin	rm -f $1
14dff6d2aeSPo-Hsu Lin}
15dff6d2aeSPo-Hsu Lin
16455ce1c7SJeremy Kerrcheck_prereqs()
17455ce1c7SJeremy Kerr{
18455ce1c7SJeremy Kerr	local msg="skip all tests:"
19455ce1c7SJeremy Kerr
20455ce1c7SJeremy Kerr	if [ $UID != 0 ]; then
21455ce1c7SJeremy Kerr		echo $msg must be run as root >&2
221f0ea958SShuah Khan (Samsung OSG)		exit $ksft_skip
23455ce1c7SJeremy Kerr	fi
24455ce1c7SJeremy Kerr
25455ce1c7SJeremy Kerr	if ! grep -q "^\S\+ $efivarfs_mount efivarfs" /proc/mounts; then
26455ce1c7SJeremy Kerr		echo $msg efivarfs is not mounted on $efivarfs_mount >&2
271f0ea958SShuah Khan (Samsung OSG)		exit $ksft_skip
28455ce1c7SJeremy Kerr	fi
29455ce1c7SJeremy Kerr}
30455ce1c7SJeremy Kerr
31455ce1c7SJeremy Kerrrun_test()
32455ce1c7SJeremy Kerr{
33455ce1c7SJeremy Kerr	local test="$1"
34455ce1c7SJeremy Kerr
35455ce1c7SJeremy Kerr	echo "--------------------"
36455ce1c7SJeremy Kerr	echo "running $test"
37455ce1c7SJeremy Kerr	echo "--------------------"
38455ce1c7SJeremy Kerr
39455ce1c7SJeremy Kerr	if [ "$(type -t $test)" = 'function' ]; then
40455ce1c7SJeremy Kerr		( $test )
41455ce1c7SJeremy Kerr	else
42455ce1c7SJeremy Kerr		( ./$test )
43455ce1c7SJeremy Kerr	fi
44455ce1c7SJeremy Kerr
45455ce1c7SJeremy Kerr	if [ $? -ne 0 ]; then
46455ce1c7SJeremy Kerr		echo "  [FAIL]"
47455ce1c7SJeremy Kerr		rc=1
48455ce1c7SJeremy Kerr	else
49455ce1c7SJeremy Kerr		echo "  [PASS]"
50455ce1c7SJeremy Kerr	fi
51455ce1c7SJeremy Kerr}
52455ce1c7SJeremy Kerr
53455ce1c7SJeremy Kerrtest_create()
54455ce1c7SJeremy Kerr{
55455ce1c7SJeremy Kerr	local attrs='\x07\x00\x00\x00'
56455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
57455ce1c7SJeremy Kerr
58455ce1c7SJeremy Kerr	printf "$attrs\x00" > $file
59455ce1c7SJeremy Kerr
60455ce1c7SJeremy Kerr	if [ ! -e $file ]; then
61455ce1c7SJeremy Kerr		echo "$file couldn't be created" >&2
62455ce1c7SJeremy Kerr		exit 1
63455ce1c7SJeremy Kerr	fi
64455ce1c7SJeremy Kerr
65455ce1c7SJeremy Kerr	if [ $(stat -c %s $file) -ne 5 ]; then
66455ce1c7SJeremy Kerr		echo "$file has invalid size" >&2
67dff6d2aeSPo-Hsu Lin		file_cleanup $file
68455ce1c7SJeremy Kerr		exit 1
69455ce1c7SJeremy Kerr	fi
70dff6d2aeSPo-Hsu Lin	file_cleanup $file
71455ce1c7SJeremy Kerr}
72455ce1c7SJeremy Kerr
73033a1a7fSJeremy Kerrtest_create_empty()
74033a1a7fSJeremy Kerr{
75033a1a7fSJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
76033a1a7fSJeremy Kerr
77033a1a7fSJeremy Kerr	: > $file
78033a1a7fSJeremy Kerr
79033a1a7fSJeremy Kerr	if [ ! -e $file ]; then
80033a1a7fSJeremy Kerr		echo "$file can not be created without writing" >&2
81033a1a7fSJeremy Kerr		exit 1
82033a1a7fSJeremy Kerr	fi
83dff6d2aeSPo-Hsu Lin	file_cleanup $file
84033a1a7fSJeremy Kerr}
85033a1a7fSJeremy Kerr
86d974f67aSJeremy Kerrtest_create_read()
87d974f67aSJeremy Kerr{
88d974f67aSJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
89d974f67aSJeremy Kerr	./create-read $file
90*c9392426SZhao Gongyi	if [ $? -ne 0 ]; then
91*c9392426SZhao Gongyi		echo "create and read $file failed"
92*c9392426SZhao Gongyi		file_cleanup $file
93*c9392426SZhao Gongyi		exit 1
94*c9392426SZhao Gongyi	fi
95dff6d2aeSPo-Hsu Lin	file_cleanup $file
96d974f67aSJeremy Kerr}
97d974f67aSJeremy Kerr
98455ce1c7SJeremy Kerrtest_delete()
99455ce1c7SJeremy Kerr{
100455ce1c7SJeremy Kerr	local attrs='\x07\x00\x00\x00'
101455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
102455ce1c7SJeremy Kerr
103455ce1c7SJeremy Kerr	printf "$attrs\x00" > $file
104455ce1c7SJeremy Kerr
105455ce1c7SJeremy Kerr	if [ ! -e $file ]; then
106455ce1c7SJeremy Kerr		echo "$file couldn't be created" >&2
107455ce1c7SJeremy Kerr		exit 1
108455ce1c7SJeremy Kerr	fi
109455ce1c7SJeremy Kerr
110dff6d2aeSPo-Hsu Lin	file_cleanup $file
111455ce1c7SJeremy Kerr
112455ce1c7SJeremy Kerr	if [ -e $file ]; then
113455ce1c7SJeremy Kerr		echo "$file couldn't be deleted" >&2
114455ce1c7SJeremy Kerr		exit 1
115455ce1c7SJeremy Kerr	fi
116455ce1c7SJeremy Kerr
117455ce1c7SJeremy Kerr}
118455ce1c7SJeremy Kerr
119455ce1c7SJeremy Kerr# test that we can remove a variable by issuing a write with only
120455ce1c7SJeremy Kerr# attributes specified
121455ce1c7SJeremy Kerrtest_zero_size_delete()
122455ce1c7SJeremy Kerr{
123455ce1c7SJeremy Kerr	local attrs='\x07\x00\x00\x00'
124455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
125455ce1c7SJeremy Kerr
126455ce1c7SJeremy Kerr	printf "$attrs\x00" > $file
127455ce1c7SJeremy Kerr
128455ce1c7SJeremy Kerr	if [ ! -e $file ]; then
129455ce1c7SJeremy Kerr		echo "$file does not exist" >&2
130455ce1c7SJeremy Kerr		exit 1
131455ce1c7SJeremy Kerr	fi
132455ce1c7SJeremy Kerr
133ed8b0de5SPeter Jones	chattr -i $file
134455ce1c7SJeremy Kerr	printf "$attrs" > $file
135455ce1c7SJeremy Kerr
136455ce1c7SJeremy Kerr	if [ -e $file ]; then
137455ce1c7SJeremy Kerr		echo "$file should have been deleted" >&2
138455ce1c7SJeremy Kerr		exit 1
139455ce1c7SJeremy Kerr	fi
140455ce1c7SJeremy Kerr}
141455ce1c7SJeremy Kerr
142455ce1c7SJeremy Kerrtest_open_unlink()
143455ce1c7SJeremy Kerr{
144455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
145455ce1c7SJeremy Kerr	./open-unlink $file
146455ce1c7SJeremy Kerr}
147455ce1c7SJeremy Kerr
148123abd76SMatt Fleming# test that we can create a range of filenames
149123abd76SMatt Flemingtest_valid_filenames()
150123abd76SMatt Fleming{
151123abd76SMatt Fleming	local attrs='\x07\x00\x00\x00'
152123abd76SMatt Fleming	local ret=0
153123abd76SMatt Fleming
154123abd76SMatt Fleming	local file_list="abc dump-type0-11-1-1362436005 1234 -"
155123abd76SMatt Fleming	for f in $file_list; do
156123abd76SMatt Fleming		local file=$efivarfs_mount/$f-$test_guid
157123abd76SMatt Fleming
158123abd76SMatt Fleming		printf "$attrs\x00" > $file
159123abd76SMatt Fleming
160123abd76SMatt Fleming		if [ ! -e $file ]; then
161123abd76SMatt Fleming			echo "$file could not be created" >&2
162123abd76SMatt Fleming			ret=1
163123abd76SMatt Fleming		else
164dff6d2aeSPo-Hsu Lin			file_cleanup $file
165ed8b0de5SPeter Jones		fi
166123abd76SMatt Fleming	done
167123abd76SMatt Fleming
168123abd76SMatt Fleming	exit $ret
169123abd76SMatt Fleming}
170123abd76SMatt Fleming
171123abd76SMatt Flemingtest_invalid_filenames()
172123abd76SMatt Fleming{
173123abd76SMatt Fleming	local attrs='\x07\x00\x00\x00'
174123abd76SMatt Fleming	local ret=0
175123abd76SMatt Fleming
176123abd76SMatt Fleming	local file_list="
177123abd76SMatt Fleming		-1234-1234-1234-123456789abc
178123abd76SMatt Fleming		foo
179123abd76SMatt Fleming		foo-bar
180123abd76SMatt Fleming		-foo-
181123abd76SMatt Fleming		foo-barbazba-foob-foob-foob-foobarbazfoo
182123abd76SMatt Fleming		foo-------------------------------------
183123abd76SMatt Fleming		-12345678-1234-1234-1234-123456789abc
184123abd76SMatt Fleming		a-12345678=1234-1234-1234-123456789abc
185123abd76SMatt Fleming		a-12345678-1234=1234-1234-123456789abc
186123abd76SMatt Fleming		a-12345678-1234-1234=1234-123456789abc
187123abd76SMatt Fleming		a-12345678-1234-1234-1234=123456789abc
188123abd76SMatt Fleming		1112345678-1234-1234-1234-123456789abc"
189123abd76SMatt Fleming
190123abd76SMatt Fleming	for f in $file_list; do
191123abd76SMatt Fleming		local file=$efivarfs_mount/$f
192123abd76SMatt Fleming
193123abd76SMatt Fleming		printf "$attrs\x00" 2>/dev/null > $file
194123abd76SMatt Fleming
195123abd76SMatt Fleming		if [ -e $file ]; then
196123abd76SMatt Fleming			echo "Creating $file should have failed" >&2
197dff6d2aeSPo-Hsu Lin			file_cleanup $file
198123abd76SMatt Fleming			ret=1
199123abd76SMatt Fleming		fi
200123abd76SMatt Fleming	done
201123abd76SMatt Fleming
202123abd76SMatt Fleming	exit $ret
203123abd76SMatt Fleming}
204123abd76SMatt Fleming
205455ce1c7SJeremy Kerrcheck_prereqs
206455ce1c7SJeremy Kerr
207455ce1c7SJeremy Kerrrc=0
208455ce1c7SJeremy Kerr
209455ce1c7SJeremy Kerrrun_test test_create
210033a1a7fSJeremy Kerrrun_test test_create_empty
211d974f67aSJeremy Kerrrun_test test_create_read
212455ce1c7SJeremy Kerrrun_test test_delete
213455ce1c7SJeremy Kerrrun_test test_zero_size_delete
214455ce1c7SJeremy Kerrrun_test test_open_unlink
215123abd76SMatt Flemingrun_test test_valid_filenames
216123abd76SMatt Flemingrun_test test_invalid_filenames
217455ce1c7SJeremy Kerr
218455ce1c7SJeremy Kerrexit $rc
219