Skip to content

Commit f3a860d

Browse files
committed
Add test case
No functional change. The large number of partitions in the test is to ensure that the code correctly handles such partition tables without a buffer overflow. Previous versions of the code did have a buffer overflow due to incorrectly computing the buffer size.
1 parent 3fbb214 commit f3a860d

File tree

5 files changed

+304
-0
lines changed

5 files changed

+304
-0
lines changed

.gitlab-ci.yml

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
checks:tests:
22
after_script:
33
- (cd qrexec-lib; gcov *.c || :)
4+
- (cd gptfixer; gcov *.c || :)
45
- ./ci/codecov-wrapper --gcov
56
before_script:
67
- sudo dnf install -y python3-pip 'pkgconfig(icu-uc)' sequoia-sqv
@@ -11,6 +12,7 @@ checks:tests:
1112
- python3 -m coverage run -m unittest discover -v imgconverter -p test.py
1213
- export CFLAGS="--coverage -DCOVERAGE" LDFLAGS=--coverage
1314
- make -C qrexec-lib check NO_REBUILD_TABLE=1
15+
- gptfixer/test.sh
1416
stage: checks
1517
tags:
1618
- docker

gptfixer/layout

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
label: gpt
2+
label-id: F4796A2A-E377-45BD-B539-D6D49E569055
3+
device: /dev/loop0
4+
unit: sectors
5+
first-lba: 24
6+
sector-size: 512
7+
table-length: 33
8+
last-lba: 41943029
9+
10+
/dev/loop0p1 : start=32, size=409592, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, uuid=FA4D6529-56DA-47C7-AE88-E2DFECB72621, name="EFI System"
11+
/dev/loop0p2 : start=411648, size= 4096, type=21686148-6449-6E6F-744E-656564454649, uuid=1E6C9DB4-1E91-46C4-846A-2030DCB13B8C, name="BIOS boot partition"
12+
/dev/loop0p3 : start=415744, size= 4096, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=5DCECC9F-71B8-4357-8039-1BEBB7A48653, name="/home"
13+
/dev/loop0p4 : start=419840, size= 4096, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4, uuid=3EA4A03F-ACCF-4EDF-99EC-8E5F2B382459, name="/usr"
14+
/dev/loop0p5 : start=423944,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
15+
/dev/loop0p6 : start=423952,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
16+
/dev/loop0p7 : start=423960,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
17+
/dev/loop0p8 : start=423968,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
18+
/dev/loop0p9 : start=423976,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
19+
/dev/loop0p10 : start=423984,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
20+
/dev/loop0p11 : start=423992,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
21+
/dev/loop0p12 : start=424000,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
22+
/dev/loop0p13 : start=424008,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
23+
/dev/loop0p14 : start=424016,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
24+
/dev/loop0p15 : start=424024,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
25+
/dev/loop0p16 : start=424032,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
26+
/dev/loop0p17 : start=424040,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
27+
/dev/loop0p18 : start=424048,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
28+
/dev/loop0p19 : start=424056,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
29+
/dev/loop0p20 : start=424064,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
30+
/dev/loop0p21 : start=424072,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
31+
/dev/loop0p22 : start=424080,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
32+
/dev/loop0p23 : start=424088,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
33+
/dev/loop0p24 : start=424096,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
34+
/dev/loop0p25 : start=424104,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
35+
/dev/loop0p26 : start=424112,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
36+
/dev/loop0p27 : start=424120,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
37+
/dev/loop0p28 : start=424128,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
38+
/dev/loop0p29 : start=424136,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
39+
/dev/loop0p30 : start=424144,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
40+
/dev/loop0p31 : start=424152,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
41+
/dev/loop0p32 : start=424160,size=8, type=00000000-0000-0000-0000-000000000000,uuid=00000000-0000-0000-0000-000000000000,name=""
42+
/dev/loop0p33 : start=424168,size=41518848,type=0FC63DAF-8483-4772-8E79-3D69D8477DE4,uuid=693244E6-3E07-47BF-AD79-ACADE4293FE7,name="Root filesystem"

gptfixer/test.sh

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/bin/bash --
2+
set -euo pipefail
3+
4+
case $0 in (/*) cd "${0%/*}/";; (*/*) cd "./${0%/*}";; (*) :;; esac
5+
make -C .. gptfixer/gpt
6+
chk () {
7+
loopdev=$(sudo losetup --nooverlap --find --sector-size "$1" --show -- dummy.img)
8+
if [[ "$loopdev" != '/dev/loop0' ]]; then
9+
printf 'Loop device is not /dev/loop0 (got %q), expect test failure\n' "$loopdev"
10+
fi >&3
11+
echo Dumping broken partition table
12+
sudo sfdisk --label=gpt --dump -- "$loopdev"
13+
sudo ./gpt fix "$loopdev"
14+
echo Dumping fixed partition table
15+
sudo sfdisk --label=gpt --dump -- "$loopdev"
16+
sudo losetup -d "$loopdev"
17+
}
18+
19+
go () (
20+
set -x
21+
truncate -s 0 dummy.img
22+
truncate -s 20GiB dummy.img
23+
sfdisk --force dummy.img < layout
24+
chk 4096
25+
chk 512
26+
)
27+
28+
case "$#,${1-}" in
29+
('1,update') go 3>&2 > test.sh.stdout 2> test.sh.stderr;;
30+
(0,)
31+
tmpdir=$(mktemp -d)
32+
go 3>&2 > "$tmpdir/stdout" 2> "$tmpdir/stderr"
33+
diff -u -- "$tmpdir/stdout" test.sh.stdout
34+
diff -u -- "$tmpdir/stderr" test.sh.stderr
35+
rm -rf -- "$tmpdir"
36+
;;
37+
(*) echo "Usage: test.sh [update]" >&2; exit 1;;
38+
esac

gptfixer/test.sh.stderr

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
+ truncate -s 0 dummy.img
2+
+ truncate -s 20GiB dummy.img
3+
+ sfdisk --force dummy.img
4+
+ chk 4096
5+
++ sudo losetup --nooverlap --find --sector-size 4096 --show -- dummy.img
6+
+ loopdev=/dev/loop0
7+
+ [[ /dev/loop0 != \/\d\e\v\/\l\o\o\p\0 ]]
8+
+ echo Dumping broken partition table
9+
+ sudo sfdisk --label=gpt --dump -- /dev/loop0
10+
GPT PMBR size mismatch (41943039 != 5242879) will be corrected by write.
11+
+ sudo ./gpt fix /dev/loop0
12+
gpt: Found GPT with different sector size, altering
13+
+ echo Dumping fixed partition table
14+
+ sudo sfdisk --label=gpt --dump -- /dev/loop0
15+
+ sudo losetup -d /dev/loop0
16+
+ chk 512
17+
++ sudo losetup --nooverlap --find --sector-size 512 --show -- dummy.img
18+
+ loopdev=/dev/loop0
19+
+ [[ /dev/loop0 != \/\d\e\v\/\l\o\o\p\0 ]]
20+
+ echo Dumping broken partition table
21+
+ sudo sfdisk --label=gpt --dump -- /dev/loop0
22+
GPT PMBR size mismatch (5242879 != 41943039) will be corrected by write.
23+
+ sudo ./gpt fix /dev/loop0
24+
gpt: Found GPT with different sector size, altering
25+
+ echo Dumping fixed partition table
26+
+ sudo sfdisk --label=gpt --dump -- /dev/loop0
27+
+ sudo losetup -d /dev/loop0

0 commit comments

Comments
 (0)