Site icon Mr. 沙先生

Nginx 編譯 BoringSSL 失敗 BIO_get_mem_data [passing argument 2]

這幾天在編譯 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 

小弟在 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 搞定。

Exit mobile version