[완료] C 를 모르는 상태에서, 소스코드를 수정하여 segfault 문제를 해결하였습니다..

pogusm의 이미지

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같은건 전혀 할줄 모르는상태에서... 그냥 찍어맞췄습니다...

조언 부탁드립니다...

pogusm의 이미지

# 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"

cococo의 이미지

저도 PHP는 잘 모릅니다만...
diff로 추가되는 내용을 보면 두번째 껀 exception 관련 .h 파일을 넣어주는 걸로 해결하니깐...
첫번째 내용보다는 좋아보이네요.
(맞는지는 잘.. ㅡ,.ㅡ;;)
행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?

pogusm의 이미지

C를 모르지만
#include "zend_exceptions.h" 를 추가해서 해결하는게 훨씨 낫다고 저도 생각했어요~

httpd,php 소스설치후 pecl-gnupg가 설치될때랑 다르게
httpd,php RPM설치후 pecl-gnupg가 설치될때 왜 zend_exceptions.h를 추가해줘야 하는지는 정확히는 모르겠지만...

아무튼 문제를 해결하게 되어 기쁩니다~

ㅎㅎ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.