2016年12月26日 星期一

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 

  • 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 搞定。





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

沒有留言:

張貼留言