Add check for a shutdown state and set engine state appropriately.
git-svn-id: https://svn.apache.org/repos/asf/harmony/enhanced/java/branches/omd@999967 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/classlib/modules/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/SSLEngineImpl.java b/classlib/modules/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/SSLEngineImpl.java
index e4cdb4e..77f8238 100644
--- a/classlib/modules/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/SSLEngineImpl.java
+++ b/classlib/modules/x-net/src/main/java/org/apache/harmony/xnet/provider/jsse/SSLEngineImpl.java
@@ -79,7 +79,7 @@
private static native long initSSLEngine(long context);
private static native HandshakeStatus connectImpl(long ssl);
private static native HandshakeStatus acceptImpl(long ssl);
- private static native SSLEngineResult wrapImpl(long sslEngineAddress,
+ private static native SSLEngineResult wrapImpl(long ssl, long sslEngineAddress,
long src_address, int src_len, long dst_address, int dst_len);
private static native SSLEngineResult unwrapImpl(long ssl, long sslEngineAddress,
long src_address, int src_len, long dst_address, int dst_len);
@@ -570,7 +570,7 @@
dst_address = AddressUtil.getDirectBufferAddress(dst_temp_buffer);
}
- SSLEngineResult result = wrapImpl(SSLEngineAddress, src_address, src_length, dst_address, dst_length);
+ SSLEngineResult result = wrapImpl(SSL, SSLEngineAddress, src_address, src_length, dst_address, dst_length);
// update the buffers contents and positions
srcs[0].position(srcs[0].position() + result.bytesConsumed());
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 f1d1f78..2123f39 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
@@ -130,13 +130,13 @@
}
JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_wrapImpl
- (JNIEnv *env, jclass clazz, jlong jsslengine, jlong src_address, int src_len,
+ (JNIEnv *env, jclass clazz, jlong jssl, jlong jsslengine, jlong src_address, int src_len,
jlong dst_address, int dst_len) {
_sslengine *sslengine = jlong2addr(_sslengine, jsslengine);
BIO *bio = sslengine->bio;
BIO *bio_io = sslengine->bio_io;
- SSL *ssl = NULL;
- int write_result = 0, read_result = 0;
+ SSL *ssl = jlong2addr(SSL, jssl);
+ int write_result = 0, read_result = 0, shutdownState = 0;
jobject handshake_state = NULL, engine_state = NULL, result = NULL;
jclass result_class;
jmethodID result_constructor;
@@ -144,7 +144,6 @@
jbyte *dst_buffer = jlong2addr(jbyte, dst_address);
int initial_init_state, init_state;
- BIO_get_ssl(bio, &ssl);
initial_init_state = SSL_in_init(ssl);
// write input data
@@ -162,6 +161,12 @@
handshake_state = handshake_need_unwrap;
engine_state = engine_ok;
}
+
+ // Check if close_notify has been sent or received
+ shutdownState = SSL_get_shutdown(ssl);
+ if (shutdownState) {
+ engine_state = engine_closed;
+ }
// read output data
read_result = BIO_read(bio_io, dst_buffer, dst_len);
@@ -198,8 +203,8 @@
_sslengine *sslengine = jlong2addr(_sslengine, jsslengine);
BIO *bio = sslengine->bio;
BIO *bio_io = sslengine->bio_io;
- SSL *ssl = NULL;
- int write_result = 0, read_result = 0;
+ SSL *ssl = jlong2addr(SSL, jssl);
+ int write_result = 0, read_result = 0, shutdownState = 0;
jobject handshake_state = NULL, engine_state = NULL, result = NULL;
jclass result_class;
jmethodID result_constructor;
@@ -207,7 +212,6 @@
jbyte *dst_buffer = jlong2addr(jbyte, dst_address);
int initial_init_state, init_state;
- BIO_get_ssl(bio, &ssl);
initial_init_state = SSL_in_init(ssl);
// write input data
@@ -218,11 +222,7 @@
}
// read output data
- //read_result = BIO_read(bio, dst_buffer, dst_len);
- read_result = SSL_read(ssl, dst_buffer, dst_len);
-
- // TODO: Check for SSL_RECEIVED_SHUTDOWN
-
+ 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;
@@ -236,6 +236,12 @@
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
diff --git a/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.h b/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.h
index 2b56fbe..80c1c59 100644
--- a/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.h
+++ b/classlib/modules/x-net/src/main/native/jsse/shared/sslEngine.h
@@ -32,7 +32,7 @@
JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_connectImpl
(JNIEnv *, jclass, jlong);
JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_wrapImpl
- (JNIEnv *, jclass, jlong, jlong, int, jlong, int);
+ (JNIEnv *, jclass, jlong, jlong, jlong, int, jlong, int);
JNIEXPORT jobject JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_unwrapImpl
(JNIEnv *, jclass, jlong, jlong, jlong, int, jlong, int);
JNIEXPORT void JNICALL Java_org_apache_harmony_xnet_provider_jsse_SSLEngineImpl_shutdownImpl