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

LeopardでCGI.pmのテストがとおらないのは変なTMPDIRのせい

mac perl

Leopardでは特殊なTMPDIR環境変数が設定されているという記事を書いた。これに関連して、このTMPDIRのせいでCGI.pmのテストが失敗する。

LeopardはTMPDIR環境変数は以下のようになっている。

$ echo $TMPDIR
/var/folders/A2/A2AtxiekJ3jlm3DDlp98aE+++TI/-Tmp-/
$ ls -l 

パーミッションは700になっていてオーナー以外はなにもできない。セキュリティのためにこういうことをしているのかな?

このTMPDIRの"A2AtxiekJ3jlm3DDlp98aE+++TI"という部分は、どうやら必ず+++TIという文字列で終了するようだ。この、+++TIというのが問題になって、CGI.pmのテストが失敗する。

CGI.pmの中では、ファイル名が正しいかどうかを判定するのに、以下のような正規表現を利用している。

$filename =~ m!^([a-zA-Z0-9_ \'\":/.\$\\-]+)$!

この正規表現は、+を含んだファイル名にマッチしない。

しかしながら、LeopardのTMPDIR環境変数には+が含まれているために、不正なファイル名であると判定されてしまい、エラーが発生する。

このエラーをおこさないためには、普通に+にマッチするように正規表現を修正してやればよい。

$filename =~ m!^([a-zA-Z0-9_ \+\'\":/.\$\\-]+)$!

MacOSX以外でも+を名前に含むファイルは作成できたので、ファイル名に+を含むこと自体には問題は無いように思える。ということは、CGI.pmのファイル名チェックがぬるいのか、それとも、何かしらの意図があるのかということになるけど、どうなんだろう。

まぁ、そもそも、TMPDIRが"/一時ファイル"とかの日本語名とかになってれば、当然のようにテストが失敗しそうではある。このへんは実装のバランスの取り方なのかも。

ちなみに、CGIのなかでCGI.pmを利用するときにはこの特殊なTMPDIR環境変数は設定されないので、実害はないと思われます。