読者です 読者をやめる 読者になる 読者になる

fsfuzzerで遊んでみました.

fuzz

ファイルシステム用のfuzzツールfsfuzzer」にminixファイルシステムをテストするコードを追加して,遊んでみました.
このツールは,何年か前の,「Month of kernel Bugs」でも使われてたような気がします.

fsfuzzの基本的な使い方は,以下の通りで単純明解です.

sudo ./fsfuzz ファイルシステム名

他のファイルシステムを参考に,minixのコードを追加しました.
正確にこれであってるかって言われると自信ないですけどorz
あ,fsfuzzってシェルスクリプトなんですが,家のPCは/bin/shは/bin/dashにリンクされてて,
bashほど機能が豊富ではないので,シェルが/bin/shだと上手く動きませんでした.
なので,先頭の#!/bin/shは#!/bin/bashに変えました.下のようなやりかたでも問題ないんですが,面倒だったのでw

sudo /bin/bash ./fsfuzz ext4

diffはこんな感じです.

--- fsfuzz.orig	2010-02-03 00:30:25.923586664 +0900
+++ fsfuzz	2010-02-03 00:44:14.055147024 +0900
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 # (c) 2006-2009 Steve Grubb <sgrubb@redhat.com>
 # (c) 2006, LMH <lmh@info-pull.com>
 #
@@ -53,6 +53,9 @@
 if [ -x /usr/bin/genromfs ] ; then
 	filesystems="$filesystems romfs"
 fi
+if [ -x /sbin/mkfs.minix ] ; then
+	filesystems="$filesystems minix"
+fi
 # ecryptfs overlays another fs, so fudge the check this way...
 if [ -x /sbin/mount.ecryptfs ] ; then
 	filesystems="$filesystems ecryptfs"
@@ -322,6 +325,8 @@
 	;;
 	reiserfs) /sbin/mkfs.reiserfs -b $BLOCKSIZE -ff -q -s 513 $file
 	;;
+	minix) /sbin/mkfs.minix -c -i 4096  $file $BLOCKSIZE 
+        ;;
 	*) /sbin/mkfs -t $fstype -f $file
 	;;
 	esac
@@ -332,7 +337,7 @@
 
 	# Populate the initial image for filesystem created from files
 	case $fstype in
-	ext?|vfat|msdos|hfs|xfs|reiserfs|ecryptfs)
+	ext?|vfat|msdos|hfs|xfs|reiserfs|ecryptfs|minix)
 		echo "Populating image..."
 
 		# OK mount the file system

これを動かしてたら,カーネルのoops出ました.

[12643.727334] BUG: unable to handle kernel paging request at ffff880140000000
[12643.727339] IP: [<ffffffffa02a00ae>] count_free+0xae/0x131 [minix]
[12643.727345] PGD 1616063 PUD 0 
[12643.727348] Oops: 0000 [#1] PREEMPT SMP 
[12643.727351] last sysfs file: /sys/devices/virtual/block/loop0/range
[12643.727353] CPU 0 
[12643.727357] Pid: 15141, comm: fstest Not tainted 2.6.33-rc6-tip+ #1 TW8/SW8/DW8/TW8/SW8/DW8
[12643.727359] RIP: 0010:[<ffffffffa02a00ae>]  [<ffffffffa02a00ae>] count_free+0xae/0x131 [minix]
[12643.727363] RSP: 0018:ffff88013be9fd90  EFLAGS: 00010203
[12643.727364] RAX: 000000002c46ff7d RBX: ffff880115418800 RCX: 000000002abe7800
[12643.727366] RDX: 000000000000077d RSI: 00000000fffd54ee RDI: ffff88007eaf70e0
[12643.727368] RBP: ffff88013be9fdb0 R08: 000000002abe7801 R09: 0000000000000400
[12643.727370] R10: ffff88007eaf7850 R11: 00000000000000ab R12: 0000000000000400
[12643.727372] R13: 0000000000000007 R14: 0000000000000075 R15: 0000000000000000
[12643.727374] FS:  00007f28f580b6f0(0000) GS:ffff880028200000(0000) knlGS:0000000000000000
[12643.727376] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[12643.727378] CR2: ffff880140000000 CR3: 000000013e485000 CR4: 00000000000406e0
[12643.727380] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[12643.727382] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[12643.727384] Process fstest (pid: 15141, threadinfo ffff88013be9e000, task ffff88013b47ac40)
[12643.727385] Stack:
[12643.727387]  ffff88013decbc80 ffff88013decbc80 0000000000700000 0000000000000000
[12643.727390] <0> ffff88013be9fdc8 ffffffffa02a0154 ffff88013be9fe28 ffff88013be9fdf8
[12643.727393] <0> ffffffffa02a2528 ffff88013be9feb8 ffff88013be9fe28 ffff88013f6d9f00
[12643.727397] Call Trace:
[12643.727401]  [<ffffffffa02a0154>] minix_count_free_blocks+0x23/0x2c [minix]
[12643.727404]  [<ffffffffa02a2528>] minix_statfs+0x5a/0xb1 [minix]
[12643.727408]  [<ffffffff810f3721>] vfs_statfs+0x60/0x78
[12643.727411]  [<ffffffff810f38ad>] vfs_statfs_native+0x22/0x3c
[12643.727414]  [<ffffffff810f3983>] sys_statfs+0x48/0x84
[12643.727416]  [<ffffffff810f3edf>] ? fsnotify_modify+0x6c/0x74
[12643.727419]  [<ffffffff810f4674>] ? vfs_write+0xd3/0x10b
[12643.727423]  [<ffffffff8132189d>] ? trace_hardirqs_on_thunk+0x3a/0x3c
[12643.727426]  [<ffffffff81002c1b>] system_call_fastpath+0x16/0x1b
[12643.727428] Code: 84 9e 00 00 00 89 d6 48 8b 4f 20 48 c1 e1 03 49 0f af c8 45 31 c0 48 29 ce 48 c1 ee 04 01 f6 eb 27 44 89 c1 48 8b 5f 28 41 ff c0 <8a> 0c 0b 88 cb 83 e1 0f c0 eb 04 48 0f be db 03 04 9d 60 3f 2a 
[12643.727458] RIP  [<ffffffffa02a00ae>] count_free+0xae/0x131 [minix]
[12643.727461]  RSP <ffff88013be9fd90>
[12643.727463] CR2: ffff880140000000
[12643.727465] ---[ end trace 9e699897668b1389 ]---

一応,バグを見つけるという意味では,テスト成功だと思います♪