SWFEditor 0.62 をリリースしました

  • 64bit 環境で seg.fault が起こる事があるので、その対処リリースです。 function の引数の処理に問題がありました。

ChangeLog

  • 64bit機で以下の function を使う時に seg.fault が発生する可能性があります。

getTagDada, replaceTagData,removeTag, printTagData, getShapeData, replaceShapeData, setShapeAdjustMode, getJpegAlpha, replacePNGData, replaceGIFData, getSoundData, replaceMovieClip, isShapeTagData, isBitmmapTagData.

不具合修正

https://sourceforge.jp/projects/swfed/scm/git/swfed/commits/253dbb3e7ed61a4fa8366ac9b97d7f9028057eb3

  • %l に対応する変数の型は long ですが int を渡している箇所が結構ありました。32bit 環境だとどちらも32bit ですが、64bit環境だと long だけ 64bit なので問題になります。(尚、int が 64bit の環境だと問題にはなりません)
  • ついでに %b を int で受け取っていたのを、zend_bool(unsigned char) に変えました。

zend_parse_parameters

引数の型は sscanf と同じはずですが、念の為確認。

php-5.5.8/Zend/zend_API.c

zend_parse_parameters => zend_parse_va_args => zend_parse_arg => zend_parse_arg

static const char *zend_parse_arg_impl(int arg_num, zval **arg, va_list
*va, const char **spec, char **error, int *severity TSRMLS_DC) /* {{{ */
<略>
    switch (c) {
        case 'l':
        case 'L':
            {
                long *p = va_arg(*va, long *);
<略>
        case 'p':
        case 's':
            {
                char **p = va_arg(*va, char **);
                int *pl = va_arg(*va, int *);
<略>
        case 'b':
            {
                zend_bool *p = va_arg(*va, zend_bool *);

%l が long なのは知ってたけど、ついでに %s の長さも調べたら int でした。あと、%b が zend_bool (unsigned char) なのにも注意です。