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 特有のコードが起因となっている。

調べておく必要がある。

次回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2009/01/31/4093576/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。