読者です 読者をやめる 読者になる 読者になる

openssl-1.0.0 + mod_ssl-2.8.31

ずいぶん昔に制作したサーバーの移転準備をしています。
openssl-1.0.0がでていたので使おうとしたら、apacheのコンパイル時に以下の様なエラーがでました。

gcc -c -I../../os/unix -I../../include -DLINUX=22 -DHAVE_SET_DUMPABLE -I/usr/include/gdbm -DMOD_SSL=208131 -DUSE_HSREGEX -DEAPI -DUSE_EXPAT -I../../lib/expat-lite `../../apaci` -fpic -DSHARED_MODULE -DSSL_COMPAT -DSSL_USE_SDBM -I/usr/local/include -DMOD_SSL_VERSION=\"2.8.31\" ssl_util_ssl.c && mv ssl_util_ssl.o ssl_util_ssl.lo
ssl_util_ssl.c: In function ‘SSL_X509_isSGC’:
ssl_util_ssl.c:327: error: ‘STACK’ undeclared (first use in this function)
ssl_util_ssl.c:327: error: (Each undeclared identifier is reported only once
ssl_util_ssl.c:327: error: for each function it appears in.)
ssl_util_ssl.c:327: error: ‘sk’ undeclared (first use in this function)
ssl_util_ssl.c:336: error: expected expression before ‘)’ token
make[4]: *** [ssl_util_ssl.lo] エラー 1
make[3]: *** [all] エラー 1
make[2]: *** [subdirs] エラー 1
make[2]: ディレクトリ `/usr/local/src/apache_1.3.41/src' から出ます
make[1]: *** [build-std] エラー 2
make[1]: ディレクトリ `/usr/local/src/apache_1.3.41' から出ます
make: *** [build] エラー 2

調べてみたところ、openssl-1.0.0で、STACK構造体が _STACK に変更になった様です。

// openssl-0.9.8n/include/openssl/stack.h 66-74
typedef struct stack_st
        {
        int num;
        char **data;
        int sorted;

        int num_alloc;
        int (*comp)(const char * const *, const char * const *);
        } STACK;

// openssl-1.0.0/include/openssl/stack.h 66-74
typedef struct stack_st
        {
        int num;
        char **data; 
        int sorted; 

        int num_alloc;
        int (*comp)(const void *, const void *);
        } _STACK;  /* Use STACK_OF(...) instead */

構造的な変更は無い様なので、mod_sslに以下の様なpatchをあてて対応しました。

--- ssl_util_ssl.orig.c 2010-04-17 13:11:24.000000000 +0900
+++ ssl_util_ssl.c      2010-04-17 13:12:05.000000000 +0900
@@ -324,7 +324,7 @@
 {
     X509_EXTENSION *ext;
     int ext_nid;
-    STACK *sk;
+    _STACK *sk;
     BOOL is_sgc;
     int idx;
     int i;
@@ -333,7 +333,7 @@
     idx = X509_get_ext_by_NID(cert, NID_ext_key_usage, -1);
     if (idx >= 0) {
         ext = X509_get_ext(cert, idx);
-        if ((sk = (STACK *)X509V3_EXT_d2i(ext)) != NULL) {
+        if ((sk = (_STACK *)X509V3_EXT_d2i(ext)) != NULL) {
             for (i = 0; i < sk_num(sk); i++) {
                 ext_nid = OBJ_obj2nid((ASN1_OBJECT *)sk_value(sk, i));
                 if (ext_nid == NID_ms_sgc || ext_nid == NID_ns_sgc) {

2010.5.20 追記
http://dsas.blog.klab.org/archives/51719714.html
こんな情報もあるようなので、1.0.0の使用は注意が必要な感じですね。

2010.5.20 追記2
http://slashdot.jp/security/comments.pl?sid=490412&cid=1742785
makeのオプションにOPTIM=-DSTACK=_STACKを指定するとソースは修正せずに対応できるようです。