tmpfs に unlink(2) のバグ発見2009年01月31日 13時21分42秒

FreeBSD 7.1-RELEASE で tmpfs のバグを発見した。ハードリンクが複数ある時に、間違ったファイル名を削除してしまう。また、この時誤って消された筈のファイルの内容も見れてしまう。

以下のスクリプトで再現できる。


% cat unlink.sh    
#!/bin/sh

echo @ cleaning
rm -rf a b
echo @ file is created and linked
echo "123" > a
ln a b
echo @ a and b should exist
ls -lsa
head a b
echo @ b is removed
#unlink b
rm b
echo @ only a should exist
ls -lsa
head a b

これが tmpfs 上で実行した結果。


% cd /mnt/tmpfs
% sh unlink.sh
@ cleaning
@ file is created and linked
@ a and b should exist
total 18
4 drwxrwxrwx   3 root  wheel   80  1 31 04:26 .
2 drwxr-xr-x  19 root  wheel  512 12 29 10:07 ..
4 -rw-r--r--   2 uyota wheel    4  1 31 04:26 a
4 -rw-r--r--   2 uyota wheel    4  1 31 04:26 b
==> a <==
123

==> b <==
123
@ b is removed
@ only a should exist
total 14
4 drwxrwxrwx   3 root  wheel   60  1 31 04:26 .
2 drwxr-xr-x  19 root  wheel  512 12 29 10:07 ..
4 -rw-r--r--   1 uyota wheel    4  1 31 04:26 b
==> a <==
123

==> b <==
123

rm b が行なわれたのに a が消えている。しかも a と b 共にファイルの中身は見ることが出来る。

こちらが ufs で行なった時の結果。


% cd /mnt/ufs
% sh unlink.sh
@ cleaning
@ file is created and linked
@ a and b should exist
total 8
2 drwxr-xr-x   2 uyota wheel  512  1 31 04:27 .
2 drwxrwxrwt  15 root  wheel  512  1 31 04:27 ..
2 -rw-r--r--   2 uyota wheel    4  1 31 04:27 a
2 -rw-r--r--   2 uyota wheel    4  1 31 04:27 b
==> a <==
123

==> b <==
123
@ b is removed
@ only a should exist
total 6
2 drwxr-xr-x   2 uyota wheel  512  1 31 04:27 .
2 drwxrwxrwt  15 root  wheel  512  1 31 04:27 ..
2 -rw-r--r--   1 uyota wheel    4  1 31 04:27 a
==> a <==
123

こちらでは、正しく b が削除され、a しか表示されていない。つまり、このバグは tmpfs 特有のコードが起因となっている。

調べておく必要がある。

次回