[완료] C 를 모르는 상태에서, 소스코드를 수정하여 segfault 문제를 해결하였습니다..
CentOS-5.5-x86_64 시스템에서, httpd,php 등을 yum을 이용해 설치한 환경하에서
php의 확장모듈중 하나인 gnupg(# pecl install gnupg 으로 설치)가 부분적으로 segfault를 일으킵니다
제가 확인한바로는 gnupg 에서 ERROR_EXCEPTION이 발생할때, /var/log/httpd/error_log를 보면, httpd가 segfault를 일으킵니다.
pecl-gnupg 가 64bit환경에서 여러문제를 일으키는것 같습니다..
답을 찾을 수 없어서,
# wget http://pecl.php.net/get/gnupg-1.3.1.tgz
# tar xfvz gnupg-1.3.1.tgz
# cd gnupg-1.3.1
# diff -urN gnupg.c.old gnupg.c
--- gnupg.c.old 2010-07-19 13:28:47.000000000 +0900
+++ gnupg.c 2010-07-19 13:28:12.000000000 +0900
@@ -55,7 +55,7 @@
php_error_docref(NULL TSRMLS_CC, E_WARNING, (char*)error); \
break; \
case 2: \
- zend_throw_exception(zend_exception_get_default(), (char*) error,
+ zend_throw_exception(NULL, (char*)error, 0 TSRMLS_CC); \
break; \
default: \
intern->errortxt = (char*)error; \
위 내용대로 소스 수정
# phpize
# ./configure
# make
# make install
Installing shared extensions: /usr/local/lib/php/extensions/no-debug-zts-20060613/
위처럼 소스를 수정한후 make && make install 해준후, 아파치를 재시작한다음에,
php의 gnupg에서 에러를 발생시켜서 error_exception 작동여부를 확인해보니 segfault 없이 정상적으로 작동하였습니다..
zend_exception_get_default() 를 그냥 NULL로 바꿔주어도 큰 문제가 없을까요?
zend_exception_get_default() 가 뭘하는 함수인지도 모르겠고...
C같은건 전혀 할줄 모르는상태에서... 그냥 찍어맞췄습니다...
조언 부탁드립니다...
두번째 해결책
# diff -urN gnupg.c.old gnupg.c
--- gnupg.c.old 2010-07-20 09:21:55.000000000 +0900
+++ gnupg.c 2010-07-20 09:21:43.000000000 +0900
@@ -20,6 +20,7 @@
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_gnupg.h"
+#include "zend_exceptions.h"
#ifdef ZEND_ENGINE_2
#include "php_gnupg_keylistiterator.h"
두번째 해결책이 훨 그럴듯 해 보이는데요??
저도 PHP는 잘 모릅니다만...
diff로 추가되는 내용을 보면 두번째 껀 exception 관련 .h 파일을 넣어주는 걸로 해결하니깐...
첫번째 내용보다는 좋아보이네요.
(맞는지는 잘.. ㅡ,.ㅡ;;)
행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?
역시 두번째가 더 나은 해결책이겠죠?
C를 모르지만
#include "zend_exceptions.h" 를 추가해서 해결하는게 훨씨 낫다고 저도 생각했어요~
httpd,php 소스설치후 pecl-gnupg가 설치될때랑 다르게
httpd,php RPM설치후 pecl-gnupg가 설치될때 왜 zend_exceptions.h를 추가해줘야 하는지는 정확히는 모르겠지만...
아무튼 문제를 해결하게 되어 기쁩니다~
ㅎㅎ
댓글 달기