這幾天在編譯 Nginx 1.11.7 with BoringSSL 的時候一直鬼打牆,屢屢編譯不成功在 make 的時候出現錯誤訊息
src/event/ngx_event_openssl.c: In function ‘ngx_ssl_parse_time’:
src/event/ngx_event_openssl.c:4072:5: error: passing argument 2 of ‘BIO_get_mem_data’ from incompatible pointer type [-Werror]
len = BIO_get_mem_data(bio, &value);
^
In file included from /tmp/nginxauto-28396-tmp/boringssl/.openssl/include/openssl/ssl.h:147:0,
from src/event/ngx_event_openssl.h:15,
from src/core/ngx_core.h:82,
from src/event/ngx_event_openssl.c:9:
/tmp/nginxauto-28396-tmp/boringssl/.openssl/include/openssl/bio.h:385:21: note: expected ‘char **’ but argument is of type ‘u_char **’
OPENSSL_EXPORT long BIO_get_mem_data(BIO *bio, char **contents);
^
cc1: all warnings being treated as errors
make[1]: *** [objs/src/event/ngx_event_openssl.o] Error 1
make[1]: Leaving directory `/tmp/nginxauto-28396-tmp/nginx-1.11.7′
make: *** [build] Error 2
把錯誤訊息拿去餵 Google 找不到任何的資料,再次檢查所有的執行流程是不是哪邊有錯誤,確認各種執行狀況只有在編譯 BoringSSL 才發生的問題。
心一橫抱著工程師求知的精神繼續查下去,從錯誤訊息分析了解到在 Nginx 編譯時出現錯誤的是
nginx/src/event/ngx_event_openssl.c:4072:5
len = BIO_get_mem_data(bio, &value);
以及對應到 BoringSSL 的部份是
boringssl/.openssl/include/openssl/bio.h:385:21
OPENSSL_EXPORT long BIO_get_mem_data(BIO *bio, char **contents);
小弟沒有學過 C,從這個訊息看來應該是 value 的 type,boringssl 是使用 char,而 nginx 則無。
終於在 nginx 的一封 mailing_lists [PATCH] SSL: fix call to BIO_get_mem_data(),看到我所遭遇的問題,並且問題在 2016/12/14 已經被 fix 了
SSL: fix call to BIO_get_mem_data().
Fixes build with BoringSSL.
但是目前最新的 nginx release 1.11.7 版本是在 2016/12/13,剛好差了一天,繼續追查此 fix 是不是有一些補丁。
終於在 nginx github 專案找到這個 fix SSL: fix call to BIO_get_mem_data(). 但是並未被在最新的發行版本,僅於內部 commit 而已,所以必須自行 fix 這個 bug
bugfix boringssl patch
- Patch 補丁修正
小弟在 github 分享了一個有關這個 case 的 patch,可以直接拿來 fix
$ cd nginx-1.11.7 $ curl -O https://raw.githubusercontent.com/shazi7804/nginxauto/master/patch/boringssl_fix_1.11.7.patch $ patch -p1 boringssl_fix_1.11.7.patch patching file src/event/ngx_event_openssl.c patching file src/event/ngx_event_openssl_stapling.c
- 自行修改檔案
由於只有兩隻檔案 ngx_event_openssl.c 和 src/event/ngx_event_openssl_stapling.c 自行修改一下就可以了。
# src/event/ngx_event_openssl.c @@ -4069,7 +4069,7 @@ ngx_ssl_parse_time( 4070 BIO_write(bio, "Tue ", sizeof("Tue ") - 1); 4071 ASN1_TIME_print(bio, asn1time); 4072 - len = BIO_get_mem_data(bio, &value); 4072 + len = BIO_get_mem_data(bio, (char **) &value);
# src/event/ngx_event_openssl_stapling.c @@ -793,7 +793,7 @@ ngx_ssl_stapling_time(ASN1_GENERALIZEDTIME *asn1time) 794 BIO_write(bio, "Tue ", sizeof("Tue ") - 1); 795 ASN1_GENERALIZEDTIME_print(bio, asn1time); 796 - len = BIO_get_mem_data(bio, &value); 796 + len = BIO_get_mem_data(bio, (char **) &value);
再次 compiler 搞定。