こんにちは、伊藤です。

FreeBSDの5.3Rから、5.5Rあたりで使われているtcsh(csh)は、
6.13.00というバージョンなのですが、このバージョンにはファイル
ディスクリプタをリークするというバグがあることに気付きました。
(もしかして、知らなかったの私だけ?)

このバグは、tcshの6.14.00では改修されています。
6系列は、tcshのバージョンが6.14.00なので大丈夫です。
4系列は、tcshのバージョンが6.12.00なので大丈夫です。

バグの発現方法は、コマンドラインから、
# echo $aaa > /dev/null
や、
# echo "AAA" > /dev/null
や、
# set > /tmp/log.txt

の様に、シェルの内部コマンドの出力をリダイレクトした場合、
その度に1つずつファイルディスクプリタを消費して行きます。

上記コマンドを実行後、fstatで、tcshのオープンしているファイル
を眺めて見ると、どんどん増えていきます。

通常、インタラクティブな用途で使用してるぶんには、あまり大きな
影響は無いかもしれませんが、このバグが顕在化するようなcshの
シェルスクリプトを延々実行させていると何かと、不都合な事が
発生するかも知れません。(kern.maxfiles超えたり)

とりあえず、パッチを付けておきますが、これってsend-prした方が
良いんでしょうか?(どうせ、6系列では直ってる事だし。)
contribの下って事もあり、どう扱えば良いものか悩んでいます。


*** sh.sem.c    Wed Aug 30 23:09:20 2006
--- sh.sem.c.orig       Wed Aug 30 23:08:36 2006
***************
*** 863,869 ****
                stderror(ERR_SYSTEM, tmp, strerror(errno));
            /* allow input files larger than 2Gb  */
  #ifndef WINNT_NATIVE
!             (void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_LARGEFILE);
  #endif /*!WINNT_NATIVE*/
            (void) dmove(fd, 0);
        }
--- 863,869 ----
                stderror(ERR_SYSTEM, tmp, strerror(errno));
            /* allow input files larger than 2Gb  */
  #ifndef WINNT_NATIVE
!           (void) fcntl(fd, O_LARGEFILE, 0);
  #endif /*!WINNT_NATIVE*/
            (void) dmove(fd, 0);
        }
***************
*** 923,929 ****
                stderror(ERR_SYSTEM, tmp, strerror(errno));
            /* allow input files larger than 2Gb  */
  #ifndef WINNT_NATIVE
!             (void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_LARGEFILE);
  #endif /*!WINNT_NATIVE*/
        }
        (void) dmove(fd, 1);
--- 923,929 ----
                stderror(ERR_SYSTEM, tmp, strerror(errno));
            /* allow input files larger than 2Gb  */
  #ifndef WINNT_NATIVE
!           (void) fcntl(fd, O_LARGEFILE, 0);
  #endif /*!WINNT_NATIVE*/
        }
        (void) dmove(fd, 1);




メールによる返信