phpの再コンパイル †debianのphp(mod-phpも)は外部GDライブラリを使用するようにコンパイルされているため、ビルトインGDライブラリでしか使えない一部のgd関数を使用できない。 # apt-get source libapache2-mod-php5 # apt-get build-dep libapache2-mod-php5 # cd php5-5.2.0/ # vi debian/rules -with-gdの行を探し、"=shared,/usr"を削る # debian/rules binary # cd .. # dpkg -i libapache2-mod-php5_*.deb # dpkg -i php5_*.deb あと/etc/php5/conf.d/gd.iniが存在したら extension=gd.so をコメントアウトしておくこと。 Debian r5/lennyの場合 †なぜか RFC822BUFFER undeclared.というエラーが出たので調べてみた。 # apt-get remove libc-client-dev # apt-get install libc-client-dev # grep RFC822BUFFER /usr/include/c-client/rfc822.h } RFC822BUFFER; typedef long (*rfc822outfull_t) (RFC822BUFFER *buf,ENVELOPE *env,BODY *body, long rfc822_output_full (RFC822BUFFER *buf,ENVELOPE *env,BODY *body,long ok8); long rfc822_output_flush (RFC822BUFFER *buf); long rfc822_output_header (RFC822BUFFER *buf,ENVELOPE *env,BODY *body, long rfc822_output_header_line (RFC822BUFFER *buf,char *type,long resent, long rfc822_output_address_line (RFC822BUFFER *buf,char *type,long resent, long rfc822_output_address_list (RFC822BUFFER *buf,ADDRESS *adr,long pretty, long rfc822_output_address (RFC822BUFFER *buf,ADDRESS *adr); long rfc822_output_cat (RFC822BUFFER *buf,char *src,const char *specials); long rfc822_output_parameter (RFC822BUFFER *buf,PARAMETER *param); long rfc822_output_stringlist (RFC822BUFFER *buf,STRINGLIST *stl); long rfc822_output_body_header (RFC822BUFFER *buf,BODY *body); long rfc822_output_text (RFC822BUFFER *buf,BODY *body); ついでに確認 # ls php5-5.2.6.dfsg.1/ext/gd/libgd/gd_secutiry.c gd_security.c etchで欠けていたファイルがちゃんとある。 # dpkg -i ../libapache2-mod-php5_5.2.6.dfsg.1-1+lenny2_i386.deb Debian r4/etchでコンパイルに失敗する †http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=506706 だそうで・・・仕方ないので何とか補完する。 php5-5.2.0/ext/gd/libgd/gd_security.cを作成 †/*
* gd_security.c
*
* Implements buffer overflow check routines.
*
* Written 2004, Phil Knirsch.
* Based on netpbm fixes by Alan Cox.
*
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include "gd.h"
int overflow2(int a, int b) {
if(a <= 0 || b <= 0) {
php_gd_error("gd warning: one parameter to a memory allocation multiplication is negative or zero, failing operation gracefully\n");
return 1;
}
if(a > INT_MAX / b) {
php_gd_error("gd warning: product of memory allocation multiplication would exceed INT_MAX, failing operation gracefully\n");
return 1;
}
return 0;
}
php5-5.2.0/ext/gd/config.m4を修正 † libgd/gdfontg.c libgd/gdtables.c libgd/gdft.c libgd/gdcache.c libgd/gdkanji.c \
libgd/wbmp.c libgd/gd_wbmp.c libgd/gdhelpers.c libgd/gd_topal.c libgd/gd_gif_in.c \
libgd/xbm.c libgd/gd_gif_out.c libgd/gd_security.c"
で、コンパイルしなおし # debian/rule clean # debian/rule binary パッケージのホールド †このままだとapt-get upgrade等で既存のパッケージによって上書きされてしまうため、パッケージをhold状態にしておく。 echo libapache2-mod-php5 hold | dpkg --set-selections ただし、新しいパッチがあたってphp5パッケージのバージョンがあがってもapt-getではインストールされなくなるので注意。(どのみち上記の症状が改善されない限り、パッチを当て続ける必要があるが・・・) echo libapache2-mod-php5 install | dpkg --set-selections |