Author: rjung Date: Mon Apr 4 09:48:28 2016 New Revision: 1737647 URL: http://svn.apache.org/viewvc?rev=1737647&view=rev Log: Support for OpenSSL 1.1.0: - BIO was made opaque post OpenSSL 1.1.0-pre4.
Modified: tomcat/native/trunk/native/include/ssl_private.h tomcat/native/trunk/native/src/ssl.c Modified: tomcat/native/trunk/native/include/ssl_private.h URL: http://svn.apache.org/viewvc/tomcat/native/trunk/native/include/ssl_private.h?rev=1737647&r1=1737646&r2=1737647&view=diff ============================================================================== --- tomcat/native/trunk/native/include/ssl_private.h (original) +++ tomcat/native/trunk/native/include/ssl_private.h Mon Apr 4 09:48:28 2016 @@ -213,6 +213,11 @@ #define OPENSSL_malloc_init CRYPTO_malloc_init #define X509_REVOKED_get0_serialNumber(x) x->serialNumber #define OpenSSL_version_num SSLeay +#define BIO_get_init(x) (x->init) +#define BIO_set_init(x,v) (x->init=v) +#define BIO_get_data(x) (x->ptr) +#define BIO_set_data(x,v) (x->ptr=v) +#define BIO_set_shutdown(x,v) (x->shutdown=v) #endif /* OPENSSL_VERSION_NUMBER < 0x10100000L */ #define MAX_ALPN_NPN_PROTO_SIZE 65535 Modified: tomcat/native/trunk/native/src/ssl.c URL: http://svn.apache.org/viewvc/tomcat/native/trunk/native/src/ssl.c?rev=1737647&r1=1737646&r2=1737647&view=diff ============================================================================== --- tomcat/native/trunk/native/src/ssl.c (original) +++ tomcat/native/trunk/native/src/ssl.c Mon Apr 4 09:48:28 2016 @@ -266,6 +266,11 @@ DH *SSL_get_dh_params(unsigned keylen) return NULL; /* impossible to reach. */ } +#if OPENSSL_VERSION_NUMBER >= 0x10100000L +static void init_bio_methods(void); +static void free_bio_methods(void); +#endif + TCN_IMPLEMENT_CALL(jint, SSL, version)(TCN_STDARGS) { UNREFERENCED_STDARGS; @@ -296,6 +301,9 @@ static apr_status_t ssl_init_cleanup(voi tcn_password_callback.cb.obj); } +#if OPENSSL_VERSION_NUMBER >= 0x10100000L + free_bio_methods(); +#endif free_dh_params(); /* @@ -729,6 +737,9 @@ TCN_IMPLEMENT_CALL(jint, SSL, initialize SSL_init_app_data2_3_idx(); init_dh_params(); +#if OPENSSL_VERSION_NUMBER >= 0x10100000L + init_bio_methods(); +#endif /* * Let us cleanup the ssl library when the library is unloaded @@ -849,10 +860,11 @@ static apr_status_t generic_bio_cleanup( void SSL_BIO_close(BIO *bi) { + BIO_JAVA *j; if (bi == NULL) return; - if (bi->ptr != NULL && (bi->flags & SSL_BIO_FLAG_CALLBACK)) { - BIO_JAVA *j = (BIO_JAVA *)bi->ptr; + j = (BIO_JAVA *)BIO_get_data(bi); + if (j != NULL && BIO_test_flags(bi, SSL_BIO_FLAG_CALLBACK)) { j->refcount--; if (j->refcount == 0) { if (j->pool) @@ -867,10 +879,11 @@ void SSL_BIO_close(BIO *bi) void SSL_BIO_doref(BIO *bi) { + BIO_JAVA *j; if (bi == NULL) return; - if (bi->ptr != NULL && (bi->flags & SSL_BIO_FLAG_CALLBACK)) { - BIO_JAVA *j = (BIO_JAVA *)bi->ptr; + j = (BIO_JAVA *)BIO_get_data(bi); + if (j != NULL && BIO_test_flags(bi, SSL_BIO_FLAG_CALLBACK)) { j->refcount++; } } @@ -884,37 +897,44 @@ static int jbs_new(BIO *bi) return 0; j->pool = NULL; j->refcount = 1; - bi->shutdown = 1; - bi->init = 0; + BIO_set_shutdown(bi, 1); + BIO_set_init(bi, 0); +#if OPENSSL_VERSION_NUMBER < 0x10100000L + /* No setter method for OpenSSL 1.1.0 available, + * but I can't find any functional use of the + * "num" field there either. + */ bi->num = -1; - bi->ptr = (char *)j; +#endif + BIO_set_data(bi, (void *)j); return 1; } static int jbs_free(BIO *bi) { + BIO_JAVA *j; if (bi == NULL) return 0; - if (bi->ptr != NULL) { - BIO_JAVA *j = (BIO_JAVA *)bi->ptr; - if (bi->init) { + j = (BIO_JAVA *)BIO_get_data(bi); + if (j != NULL) { + if (BIO_get_init(bi)) { JNIEnv *e = NULL; - bi->init = 0; + BIO_set_init(bi, 0); tcn_get_java_env(&e); TCN_UNLOAD_CLASS(e, j->cb.obj); } - OPENSSL_free(bi->ptr); + OPENSSL_free(j); } - bi->ptr = NULL; + BIO_set_data(bi, NULL); return 1; } static int jbs_write(BIO *b, const char *in, int inl) { jint ret = -1; - if (b->init && in != NULL) { - BIO_JAVA *j = (BIO_JAVA *)b->ptr; + if (BIO_get_init(b) && in != NULL) { + BIO_JAVA *j = (BIO_JAVA *)BIO_get_data(b); JNIEnv *e = NULL; jbyteArray jb; tcn_get_java_env(&e); @@ -939,8 +959,8 @@ static int jbs_write(BIO *b, const char static int jbs_read(BIO *b, char *out, int outl) { jint ret = 0; - if (b->init && out != NULL) { - BIO_JAVA *j = (BIO_JAVA *)b->ptr; + if (BIO_get_init(b) && out != NULL) { + BIO_JAVA *j = (BIO_JAVA *)BIO_get_data(b); JNIEnv *e = NULL; jbyteArray jb; tcn_get_java_env(&e); @@ -966,8 +986,8 @@ static int jbs_read(BIO *b, char *out, i static int jbs_puts(BIO *b, const char *in) { int ret = 0; - if (b->init && in != NULL) { - BIO_JAVA *j = (BIO_JAVA *)b->ptr; + if (BIO_get_init(b) && in != NULL) { + BIO_JAVA *j = (BIO_JAVA *)BIO_get_data(b); JNIEnv *e = NULL; tcn_get_java_env(&e); ret = (*e)->CallIntMethod(e, j->cb.obj, @@ -980,8 +1000,8 @@ static int jbs_puts(BIO *b, const char * static int jbs_gets(BIO *b, char *out, int outl) { int ret = 0; - if (b->init && out != NULL) { - BIO_JAVA *j = (BIO_JAVA *)b->ptr; + if (BIO_get_init(b) && out != NULL) { + BIO_JAVA *j = (BIO_JAVA *)BIO_get_data(b); JNIEnv *e = NULL; jobject o; tcn_get_java_env(&e); @@ -1015,6 +1035,7 @@ static long jbs_ctrl(BIO *b, int cmd, lo return ret; } +#if OPENSSL_VERSION_NUMBER < 0x10100000L static BIO_METHOD jbs_methods = { BIO_TYPE_FILE, "Java Callback", @@ -1027,10 +1048,34 @@ static BIO_METHOD jbs_methods = { jbs_free, NULL }; +#else +static BIO_METHOD *jbs_methods = NULL; + +static void init_bio_methods(void) +{ + jbs_methods = BIO_meth_new(BIO_TYPE_FILE, "Java Callback"); + BIO_meth_set_write(jbs_methods, &jbs_write); + BIO_meth_set_read(jbs_methods, &jbs_read); + BIO_meth_set_puts(jbs_methods, &jbs_puts); + BIO_meth_set_gets(jbs_methods, &jbs_gets); + BIO_meth_set_ctrl(jbs_methods, &jbs_ctrl); + BIO_meth_set_create(jbs_methods, &jbs_new); + BIO_meth_set_destroy(jbs_methods, &jbs_free); +} + +static void free_bio_methods(void) +{ + BIO_meth_free(jbs_methods); +} +#endif static BIO_METHOD *BIO_jbs() { +#if OPENSSL_VERSION_NUMBER < 0x10100000L return(&jbs_methods); +#else + return jbs_methods; +#endif } TCN_IMPLEMENT_CALL(jlong, SSL, newBIO)(TCN_STDARGS, jlong pool, @@ -1046,7 +1091,7 @@ TCN_IMPLEMENT_CALL(jlong, SSL, newBIO)(T tcn_ThrowException(e, "Create BIO failed"); goto init_failed; } - j = (BIO_JAVA *)bio->ptr; + j = (BIO_JAVA *)BIO_get_data(bio); if (j == NULL) { tcn_ThrowException(e, "Create BIO failed"); goto init_failed; @@ -1066,8 +1111,8 @@ TCN_IMPLEMENT_CALL(jlong, SSL, newBIO)(T /* TODO: Check if method id's are valid */ j->cb.obj = (*e)->NewGlobalRef(e, callback); - bio->init = 1; - bio->flags = SSL_BIO_FLAG_CALLBACK; + BIO_set_init(bio, 1); + BIO_set_flags(bio, SSL_BIO_FLAG_CALLBACK); return P2J(bio); init_failed: return 0; --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org