重松と申します。

はじめまして。こちらでは初めての発言となります。

MacOS 9.2 で Metrowerks CodeWarrior Pro 6 を使って開発をしています。(自宅、
趣味です) 会社では VineLinux 2.1.5 (intel) を使っていますが、こちらでは PHP
を使って開発をしています。

以後、よろしくお願いいたします。

PHP は ruby の正規表現ルーチンを使っている、ということを聞き、REALbasic
(http://www.realsoftware.com) という Macintosh 用の BASIC 言語でも、正規表現
を使えるように plugin を作成したいと考え、本日、ruby-1.6.4 をダウンロードさ
せて頂きました。

    ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.6.4.tar.gz

早速で恐縮なのですが、regex.c を読んでいるのですが、
どうもバグではないかと思える箇所があります。

DOUBLE_STACK というマクロが定義されているのですが、この中で、
xmalloc (実体は malloc?) や、xrealloc を呼び出し、
その失敗を一切確認していません。

    stackx = (type*)xmalloc(2 * xlen * sizeof(type));
    memcpy(stackx, stackb, xlen * sizeof (type));

このままだと、xmalloc が失敗したときに、不正な転送操作をすると思われます。

また、realloc() の使い方自体を間違えていると思われる箇所がありました。

re_compile_pattern の中ですが、realloc は最初の引数、
古いポインタが null の場合には、malloc と等価ですから、
if(bufp->buffer) のように確認する意味はありませんし、
realloc は失敗すると null を返しますが、元々渡したポインタは、
何もされませんから (もちろん解放もされない)、そのままリークすると思います。

インデントは自分が読みやすいように変えてあります。

#if 0    /* OLDIES */
        if(bufp->buffer){
            /* EXTEND_BUFFER loses when bufp->allocated is 0.  */
            bufp->buffer = (char*)xrealloc(bufp->buffer, INIT_BUF_SIZE);
        }else{
            /* Caller did not allocate a buffer.  Do it for them.  */
            bufp->buffer = (char*)xmalloc(INIT_BUF_SIZE);
        }
        if(!bufp->buffer) goto memory_exhausted;
#else    /* { os : 2001/09/08 } BUGFIX */
        {
            char *new_buffer = (char*)xrealloc(bufp->buffer, INIT_BUF_SIZE);
            if(!new_buffer) goto memory_exhausted;
            bufp->buffer = new_buffer;
        }
#endif

まだまだ C および ruby に対する理解が乏しいため、
どのように修正すればよいのかよく理解できていません。

この件について、何らかのアドバイスをいただければ幸いです。

-- 
Osamu Shigematsu

http://www.ravi.ne.jp/%7eshige/
mailto:shige / ravi.ne.jp