Skip to content

Commit 34ae7d9

Browse files
committed
Check for OpenSSL functions in headers
While building with a custom build of OpenSSL, I noticed in mkmf.log that all the feature detection checks are done using a program lacking an OpenSSL header include. `mkmf` retries using a fallback program when this fails, but that means all the `have_func` calls compile twice when compiling once should suffice. Example log without this commit: have_func: checking for X509_STORE_CTX_get0_cert()... -------------------- yes DYLD_FALLBACK_LIBRARY_PATH=.:../.. "clang -o conftest ... conftest.c:14:57: error: use of undeclared identifier 'X509_STORE_CTX_get0_cert' int t(void) { void ((*volatile p)()); p = (void ((*)()))X509_STORE_CTX_get0_cert; return !p; } ^ 1 error generated. checked program was: /* begin */ 1: #include "ruby.h" 2: 3: /*top*/ 4: extern int t(void); 5: int main(int argc, char **argv) 6: { 7: if (argc > 1000000) { 8: int (* volatile tp)(void)=(int (*)(void))&t; 9: printf("%d", (*tp)()); 10: } 11: 12: return !!argv[argc]; 13: } 14: int t(void) { void ((*volatile p)()); p = (void ((*)()))X509_STORE_CTX_get0_cert; return !p; } /* end */ DYLD_FALLBACK_LIBRARY_PATH=.:../.. "clang -o conftest ... checked program was: /* begin */ 1: #include "ruby.h" 2: 3: /*top*/ 4: extern int t(void); 5: int main(int argc, char **argv) 6: { 7: if (argc > 1000000) { 8: int (* volatile tp)(void)=(int (*)(void))&t; 9: printf("%d", (*tp)()); 10: } 11: 12: return !!argv[argc]; 13: } 14: extern void X509_STORE_CTX_get0_cert(); 15: int t(void) { X509_STORE_CTX_get0_cert(); return 0; } /* end */ The second compilation succeeds. Specify the header for each checked function.
1 parent e9798b1 commit 34ae7d9

File tree

1 file changed

+51
-46
lines changed

1 file changed

+51
-46
lines changed

ext/openssl/extconf.rb

Lines changed: 51 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,13 @@ def find_openssl_library
120120
end
121121

122122
Logging::message "=== Checking for OpenSSL features... ===\n"
123+
evp_h = "openssl/evp.h".freeze
124+
x509_h = "openssl/x509.h".freeze
125+
ts_h = "openssl/ts.h".freeze
126+
ssl_h = "openssl/ssl.h".freeze
127+
123128
# compile options
124-
have_func("RAND_egd")
129+
have_func("RAND_egd", "openssl/rand.h")
125130
engines = %w{dynamic 4758cca aep atalla chil
126131
cswift nuron sureware ubsec padlock capi gmp gost cryptodev}
127132
engines.each { |name|
@@ -132,55 +137,55 @@ def find_openssl_library
132137
if !have_struct_member("SSL", "ctx", "openssl/ssl.h") || is_libressl
133138
$defs.push("-DHAVE_OPAQUE_OPENSSL")
134139
end
135-
have_func("EVP_MD_CTX_new")
136-
have_func("EVP_MD_CTX_free")
137-
have_func("EVP_MD_CTX_pkey_ctx")
138-
have_func("X509_STORE_get_ex_data")
139-
have_func("X509_STORE_set_ex_data")
140-
have_func("X509_STORE_get_ex_new_index")
141-
have_func("X509_CRL_get0_signature")
142-
have_func("X509_REQ_get0_signature")
143-
have_func("X509_REVOKED_get0_serialNumber")
144-
have_func("X509_REVOKED_get0_revocationDate")
145-
have_func("X509_get0_tbs_sigalg")
146-
have_func("X509_STORE_CTX_get0_untrusted")
147-
have_func("X509_STORE_CTX_get0_cert")
148-
have_func("X509_STORE_CTX_get0_chain")
149-
have_func("OCSP_SINGLERESP_get0_id")
150-
have_func("SSL_CTX_get_ciphers")
151-
have_func("X509_up_ref")
152-
have_func("X509_CRL_up_ref")
153-
have_func("X509_STORE_up_ref")
154-
have_func("SSL_SESSION_up_ref")
155-
have_func("EVP_PKEY_up_ref")
156-
have_func("SSL_CTX_set_min_proto_version(NULL, 0)", "openssl/ssl.h")
157-
have_func("SSL_CTX_get_security_level")
158-
have_func("X509_get0_notBefore")
159-
have_func("SSL_SESSION_get_protocol_version")
160-
have_func("TS_STATUS_INFO_get0_status")
161-
have_func("TS_STATUS_INFO_get0_text")
162-
have_func("TS_STATUS_INFO_get0_failure_info")
163-
have_func("TS_VERIFY_CTS_set_certs(NULL, NULL)", "openssl/ts.h")
164-
have_func("TS_VERIFY_CTX_set_store")
165-
have_func("TS_VERIFY_CTX_add_flags")
166-
have_func("TS_RESP_CTX_set_time_cb")
167-
have_func("EVP_PBE_scrypt")
168-
have_func("SSL_CTX_set_post_handshake_auth")
140+
have_func("EVP_MD_CTX_new", evp_h)
141+
have_func("EVP_MD_CTX_free", evp_h)
142+
have_func("EVP_MD_CTX_pkey_ctx", evp_h)
143+
have_func("X509_STORE_get_ex_data", x509_h)
144+
have_func("X509_STORE_set_ex_data", x509_h)
145+
have_func("X509_STORE_get_ex_new_index", x509_h)
146+
have_func("X509_CRL_get0_signature", x509_h)
147+
have_func("X509_REQ_get0_signature", x509_h)
148+
have_func("X509_REVOKED_get0_serialNumber", x509_h)
149+
have_func("X509_REVOKED_get0_revocationDate", x509_h)
150+
have_func("X509_get0_tbs_sigalg", x509_h)
151+
have_func("X509_STORE_CTX_get0_untrusted", x509_h)
152+
have_func("X509_STORE_CTX_get0_cert", x509_h)
153+
have_func("X509_STORE_CTX_get0_chain", x509_h)
154+
have_func("OCSP_SINGLERESP_get0_id", "openssl/ocsp.h")
155+
have_func("SSL_CTX_get_ciphers", ssl_h)
156+
have_func("X509_up_ref", x509_h)
157+
have_func("X509_CRL_up_ref", x509_h)
158+
have_func("X509_STORE_up_ref", x509_h)
159+
have_func("SSL_SESSION_up_ref", ssl_h)
160+
have_func("EVP_PKEY_up_ref", evp_h)
161+
have_func("SSL_CTX_set_min_proto_version(NULL, 0)", ssl_h)
162+
have_func("SSL_CTX_get_security_level", ssl_h)
163+
have_func("X509_get0_notBefore", x509_h)
164+
have_func("SSL_SESSION_get_protocol_version", ssl_h)
165+
have_func("TS_STATUS_INFO_get0_status", ts_h)
166+
have_func("TS_STATUS_INFO_get0_text", ts_h)
167+
have_func("TS_STATUS_INFO_get0_failure_info", ts_h)
168+
have_func("TS_VERIFY_CTS_set_certs(NULL, NULL)", ts_h)
169+
have_func("TS_VERIFY_CTX_set_store", ts_h)
170+
have_func("TS_VERIFY_CTX_add_flags", ts_h)
171+
have_func("TS_RESP_CTX_set_time_cb", ts_h)
172+
have_func("EVP_PBE_scrypt", evp_h)
173+
have_func("SSL_CTX_set_post_handshake_auth", ssl_h)
169174

170175
# added in 1.1.1
171-
have_func("EVP_PKEY_check")
172-
have_func("SSL_CTX_set_ciphersuites")
176+
have_func("EVP_PKEY_check", evp_h)
177+
have_func("SSL_CTX_set_ciphersuites", ssl_h)
173178

174179
# added in 3.0.0
175-
have_func("SSL_set0_tmp_dh_pkey")
176-
have_func("ERR_get_error_all")
177-
have_func("TS_VERIFY_CTX_set_certs(NULL, NULL)", "openssl/ts.h")
178-
have_func("SSL_CTX_load_verify_file")
179-
have_func("BN_check_prime")
180-
have_func("EVP_MD_CTX_get0_md")
181-
have_func("EVP_MD_CTX_get_pkey_ctx")
182-
have_func("EVP_PKEY_eq")
183-
have_func("EVP_PKEY_dup")
180+
have_func("SSL_set0_tmp_dh_pkey", ssl_h)
181+
have_func("ERR_get_error_all", "openssl/err.h")
182+
have_func("TS_VERIFY_CTX_set_certs(NULL, NULL)", ts_h)
183+
have_func("SSL_CTX_load_verify_file", ssl_h)
184+
have_func("BN_check_prime", "openssl/bn.h")
185+
have_func("EVP_MD_CTX_get0_md", evp_h)
186+
have_func("EVP_MD_CTX_get_pkey_ctx", evp_h)
187+
have_func("EVP_PKEY_eq", evp_h)
188+
have_func("EVP_PKEY_dup", evp_h)
184189

185190
Logging::message "=== Checking done. ===\n"
186191

0 commit comments

Comments
 (0)