SWFEditor 0.62 をリリースしました
- 64bit 環境で seg.fault が起こる事があるので、その対処リリースです。 function の引数の処理に問題がありました。
- http://sourceforge.jp/projects/swfed/releases
- http://sourceforge.jp/projects/swfed/wiki/ChangeLog#h1-0.62
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) なのにも注意です。