xref: /freebsd/tools/test/stress2/misc/msdos20.sh (revision ee3960cba1068e12fb032a68c46d74841d9edab3)
1#!/bin/sh
2
3#
4# Copyright (c) 2025 Peter Holm <pho@FreeBSD.org>
5#
6# SPDX-License-Identifier: BSD-2-Clause
7#
8
9# msdosfs disk image fuzz test.
10# No problems seen
11
12. ../default.cfg
13
14[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
15
16cc -o /tmp/flip -Wall -Wextra -O2 ../tools/flip.c || exit 1
17
18set -eu
19u1=$mdstart
20u2=$((mdstart + 1))
21mp1=${mntpoint}$u1
22mp2=${mntpoint}$u2
23mkdir -p $mp1 $mp2
24prog=$(basename "$0" .sh)
25backup=/tmp/$prog.sh.diskimage.`date +%Y%m%dT%H%M%S`
26cap=$((32 * 1024))	# Only fuzz the first 32k
27log=$mp1/$prog.sh.log
28diskimage=$mp1/msdos20.sh.diskimage
29
30set +e
31mount | grep "on $mp2 " | grep -q /dev/md && umount -f $mp2
32mount | grep "on $mp1 " | grep -q /dev/md && umount -f $mp1
33[ -c /dev/md$u2 ] && mdconfig -d -u $u2
34[ -c /dev/md$u1 ] && mdconfig -d -u $u1
35mdconfig -a -t swap -s 2g -u $u1
36newfs -U /dev/md$u1 > /dev/null
37mount /dev/md$u1 $mp1
38
39size=32m
40type=`jot -r 1 1 3`
41[ $type -eq 3 ] && size=260m
42[ -c /dev/md$u2 ] && mdconfig -d -u $u2
43dd if=/dev/zero of=$diskimage bs=$size count=1 status=none
44mdconfig -a -t vnode -f $diskimage -u $u2
45[ $type -eq 1 ] && newfs_msdos -F 12         /dev/md$u2 > /dev/null 2>&1
46[ $type -eq 2 ] && newfs_msdos -F 16         /dev/md$u2 > /dev/null 2>&1
47[ $type -eq 3 ] && newfs_msdos -F 32 -b 4096 /dev/md$u2 > /dev/null 2>&1
48
49mount -t msdosfs /dev/md$u2 $mp2 || { echo "Initial mount of type $type failed"; exit 1; }
50if [ -d /usr/include/sys ]; then
51	mkdir $mp2/sys
52	cp /usr/include/sys/elf_common.h $mp2/sys
53	cp /usr/include/sys/soundcard.h  $mp2/sys
54	cp /usr/include/sys/sysproto.h   $mp2/sys
55fi
56umount $mp2
57
58cd $mp1
59start=`date +%s`
60nn=0
61s=0
62while [ $((`date +%s` - start)) -lt 240 ]; do
63	mount -t msdosfs /dev/md$u2 $mp2 2>/dev/null || { s=1; break; }
64	ls -lR $mp2 > /dev/null 2>&1 ||  { s=2; break; }
65	rm -rf $mp2/* > /dev/null 2>&1 || { s=3; break; }
66	touch $mp2/`jot -rc 8 a z | tr -d '\n'` || { s=4; break; }
67	while mount | grep -q "on $mp2 "; do umount $mp2; done
68	echo * | grep -q core && { s=5; break; }
69	sync
70	mdconfig -d -u $u2
71	/tmp/flip -n 10 -s $cap $diskimage
72	cp $diskimage $backup
73	fsync $backup
74	sync
75	mdconfig -a -t vnode -f $diskimage -u $u2
76	nn=$((nn + 1))
77done
78#echo "Exit after $nn loops on a type $type MSDOS FS with code $s"
79mount | grep -q "on $mp2 " && umount $mp2
80mdconfig -d -u $u2 || exit 1
81
82echo * | grep -q core && { ls -l *.core; cp $log /tmp; exit 106; } ||
83cd /tmp
84umount $mp1
85mdconfig -d -u $u1
86rm -f /tmp/flip $backup
87exit 0
88