Commit x-net-9.patch patch for HARMONY-6627 ([classlib][x-net] Creating a JSSE provider based on OpenSSL) with some minor modifications.
git-svn-id: https://svn.apache.org/repos/asf/harmony/enhanced/java/branches/omd@1000033 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.c b/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.c
index 2123f39..10491e8 100644
--- a/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.c
+++ b/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.c
@@ -137,7 +137,7 @@
BIO *bio_io = sslengine->bio_io;
SSL *ssl = jlong2addr(SSL, jssl);
int write_result = 0, read_result = 0, shutdownState = 0;
- jobject handshake_state = NULL, engine_state = NULL, result = NULL;
+ jobject handshake_state = NULL, engine_state = engine_ok, result = NULL;
jclass result_class;
jmethodID result_constructor;
jbyte *src_buffer = jlong2addr(jbyte, src_address);
@@ -147,19 +147,18 @@
initial_init_state = SSL_in_init(ssl);
// write input data
- write_result = BIO_write(bio, (const void *)src_buffer, (int)src_len);
+ if (BIO_ctrl_get_write_guarantee(bio) >= (size_t)src_len) {
+ write_result = BIO_write(bio, (const void *)src_buffer, (int)src_len);
+ } else {
+ write_result = 0;
+ }
+
if (write_result > 0) {
// wrote some data so must not be handshaking
handshake_state = handshake_not_handshaking;
- if (write_result < src_len) {
- engine_state = engine_buffer_overflow;
- } else {
- engine_state = engine_ok;
- }
} else {
write_result = 0;
handshake_state = handshake_need_unwrap;
- engine_state = engine_ok;
}
// Check if close_notify has been sent or received
@@ -169,7 +168,12 @@
}
// read output data
- read_result = BIO_read(bio_io, dst_buffer, dst_len);
+ // if the destination buffer is too small
+ if (BIO_ctrl_pending(bio_io) > (size_t)dst_len) {
+ engine_state = engine_buffer_overflow;
+ } else {
+ read_result = BIO_read(bio_io, dst_buffer, dst_len);
+ }
if (read_result < 0) {
// change state?
@@ -205,12 +209,13 @@
BIO *bio_io = sslengine->bio_io;
SSL *ssl = jlong2addr(SSL, jssl);
int write_result = 0, read_result = 0, shutdownState = 0;
- jobject handshake_state = NULL, engine_state = NULL, result = NULL;
+ jobject handshake_state = handshake_not_handshaking, engine_state = engine_ok, result = NULL;
jclass result_class;
jmethodID result_constructor;
jbyte *src_buffer = jlong2addr(jbyte, src_address);
jbyte *dst_buffer = jlong2addr(jbyte, dst_address);
- int initial_init_state, init_state;
+ int initial_init_state;
+ int read_pending = 0;
initial_init_state = SSL_in_init(ssl);
@@ -221,36 +226,35 @@
write_result = 0;
}
+ // TODO check for errors
// read output data
- read_result = BIO_read(bio, dst_buffer, dst_len);
- if (read_result > 0) {
- // wrote some data so must not be handshaking
- handshake_state = handshake_not_handshaking;
- if (read_result < src_len) {
- engine_state = engine_buffer_underflow;
+ read_pending = BIO_ctrl_pending(bio);
+ if (read_pending != 0) {
+ if (read_pending > dst_len) {
+ engine_state = engine_buffer_overflow;
} else {
- engine_state = engine_ok;
+ read_result = SSL_read(ssl, dst_buffer, dst_len);
+
+ // Check if close_notify has been sent or received
+ shutdownState = SSL_get_shutdown(ssl);
+ if (shutdownState) {
+ engine_state = engine_closed;
+ }
+
+ if (read_result < 0) {
+ read_result = 0;
+ }
}
- } else {
- read_result = 0;
- handshake_state = handshake_need_wrap;
- engine_state = engine_ok;
- }
-
- // Check if close_notify has been sent or received
- shutdownState = SSL_get_shutdown(ssl);
- if (shutdownState) {
- engine_state = engine_closed;
- }
-
- init_state = SSL_in_init(ssl);
- // if not in SSL init state
- if (!init_state) {
- // if we were in init state when we entered this function
- if (initial_init_state) {
- handshake_state = handshake_finished;
+ // if not in SSL init state
+ if (SSL_in_init(ssl)) {
+ handshake_state = handshake_need_wrap;
} else {
- handshake_state = handshake_not_handshaking;
+ // if we were in init state when we entered this function
+ if (initial_init_state) {
+ handshake_state = handshake_finished;
+ } else {
+ handshake_state = handshake_not_handshaking;
+ }
}
}
@@ -260,7 +264,7 @@
"(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V");
result = (*env)->NewObject(env, result_class, result_constructor,
engine_state, handshake_state, write_result, read_result);
- return result;
+ return result;
}
void shutdownImpl(JNIEnv *env, SSL *ssl) {