You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2006/11/10 10:53:30 UTC
svn commit: r473293 - in /tomcat/connectors/trunk/jni/native/src: network.c
sslnetwork.c
Author: mturk
Date: Fri Nov 10 01:53:30 2006
New Revision: 473293
URL: http://svn.apache.org/viewvc?view=rev&rev=473293
Log:
Make sure we register out cleanups before APR cleanups
gets registered.
Modified:
tomcat/connectors/trunk/jni/native/src/network.c
tomcat/connectors/trunk/jni/native/src/sslnetwork.c
Modified: tomcat/connectors/trunk/jni/native/src/network.c
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jni/native/src/network.c?view=diff&rev=473293&r1=473292&r2=473293
==============================================================================
--- tomcat/connectors/trunk/jni/native/src/network.c (original)
+++ tomcat/connectors/trunk/jni/native/src/network.c Fri Nov 10 01:53:30 2006
@@ -83,8 +83,9 @@
if (s->net && s->net->cleanup)
(*s->net->cleanup)(s->opaque);
if (s->sock) {
- apr_socket_close(s->sock);
+ apr_socket_t *as = s->sock;
s->sock = NULL;
+ apr_socket_close(as);
}
#ifdef TCN_DO_STATISTICS
apr_atomic_inc32(&sp_cleared);
@@ -181,6 +182,15 @@
GET_S_FAMILY(f, family);
GET_S_TYPE(t, type);
+ a = (tcn_socket_t *)apr_pcalloc(p, sizeof(tcn_socket_t));
+ TCN_CHECK_ALLOCATED(a);
+ a->pool = p;
+ if (family >= 0)
+ a->net = &apr_socket_layer;
+ apr_pool_cleanup_register(p, (const void *)a,
+ sp_socket_cleanup,
+ apr_pool_cleanup_null);
+
if (family >= 0) {
TCN_THROW_IF_ERR(apr_socket_create(&s,
f, t, protocol, p), a);
@@ -188,17 +198,10 @@
#ifdef TCN_DO_STATISTICS
sp_created++;
#endif
- a = (tcn_socket_t *)apr_pcalloc(p, sizeof(tcn_socket_t));
- TCN_CHECK_ALLOCATED(a);
a->sock = s;
- a->pool = p;
if (family >= 0)
a->net = &apr_socket_layer;
a->opaque = s;
- apr_pool_cleanup_register(p, (const void *)a,
- sp_socket_cleanup,
- apr_pool_cleanup_null);
-
cleanup:
return P2J(a);
@@ -209,6 +212,17 @@
tcn_socket_t *s = J2P(sock, tcn_socket_t *);
UNREFERENCED_STDARGS;
TCN_ASSERT(sock != 0);
+
+ if (s->net && s->net->cleanup) {
+ (*s->net->cleanup)(s->opaque);
+ s->net = NULL;
+ }
+ if (s->sock) {
+ apr_socket_t *as = s->sock;
+ s->sock = NULL;
+ apr_socket_close(as);
+ }
+
apr_pool_destroy(s->pool);
}
@@ -272,8 +286,9 @@
s->net = NULL;
}
if (s->sock) {
- rv = (jint)apr_socket_close(s->sock);
+ apr_socket_t *as = s->sock;
s->sock = NULL;
+ rv = (jint)apr_socket_close(as);
}
return rv;
}
@@ -316,6 +331,13 @@
if (s->net->type == TCN_SOCKET_APR) {
TCN_ASSERT(s->sock != NULL);
+ a = (tcn_socket_t *)apr_pcalloc(p, sizeof(tcn_socket_t));
+ TCN_CHECK_ALLOCATED(a);
+ a->pool = p;
+ apr_pool_cleanup_register(p, (const void *)a,
+ sp_socket_cleanup,
+ apr_pool_cleanup_null);
+
TCN_THROW_IF_ERR(apr_socket_accept(&n, s->sock, p), n);
}
else {
@@ -326,15 +348,9 @@
#ifdef TCN_DO_STATISTICS
apr_atomic_inc32(&sp_accepted);
#endif
- a = (tcn_socket_t *)apr_pcalloc(p, sizeof(tcn_socket_t));
- TCN_CHECK_ALLOCATED(a);
- a->sock = n;
- a->pool = p;
a->net = &apr_socket_layer;
+ a->sock = n;
a->opaque = n;
- apr_pool_cleanup_register(p, (const void *)a,
- sp_socket_cleanup,
- apr_pool_cleanup_null);
}
cleanup:
@@ -354,6 +370,13 @@
TCN_THROW_IF_ERR(apr_pool_create(&p, s->pool), p);
if (s->net->type == TCN_SOCKET_APR) {
TCN_ASSERT(s->sock != NULL);
+ a = (tcn_socket_t *)apr_pcalloc(p, sizeof(tcn_socket_t));
+ TCN_CHECK_ALLOCATED(a);
+ a->pool = p;
+ apr_pool_cleanup_register(p, (const void *)a,
+ sp_socket_cleanup,
+ apr_pool_cleanup_null);
+
TCN_THROW_IF_ERR(apr_socket_accept(&n, s->sock, p), n);
}
else {
@@ -364,15 +387,9 @@
#ifdef TCN_DO_STATISTICS
apr_atomic_inc32(&sp_accepted);
#endif
- a = (tcn_socket_t *)apr_pcalloc(p, sizeof(tcn_socket_t));
- TCN_CHECK_ALLOCATED(a);
- a->sock = n;
- a->pool = p;
a->net = &apr_socket_layer;
+ a->sock = n;
a->opaque = n;
- apr_pool_cleanup_register(p, (const void *)a,
- sp_socket_cleanup,
- apr_pool_cleanup_null);
}
return P2J(a);
cleanup:
Modified: tomcat/connectors/trunk/jni/native/src/sslnetwork.c
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jni/native/src/sslnetwork.c?view=diff&rev=473293&r1=473292&r2=473293
==============================================================================
--- tomcat/connectors/trunk/jni/native/src/sslnetwork.c (original)
+++ tomcat/connectors/trunk/jni/native/src/sslnetwork.c Fri Nov 10 01:53:30 2006
@@ -97,10 +97,15 @@
tcn_ssl_conn_t *con = (tcn_ssl_conn_t *)data;
if (con) {
+ /* Pollset was already destroyed by
+ * the pool cleanup/destroy.
+ */
+ con->pollset = NULL;
if (con->ssl) {
- ssl_smart_shutdown(con->ssl, con->shutdown_type);
- SSL_free(con->ssl);
- con->ssl = NULL;
+ SSL *ssl = con->ssl;
+ con->ssl = NULL;
+ ssl_smart_shutdown(ssl, con->shutdown_type);
+ SSL_free(ssl);
}
if (con->peer) {
X509_free(con->peer);
@@ -157,6 +162,12 @@
return con;
}
+#ifdef WIN32
+#define APR_INVALID_SOCKET INVALID_SOCKET
+#else
+#define APR_INVALID_SOCKET -1
+#endif
+
static apr_status_t wait_for_io_or_timeout(tcn_ssl_conn_t *con,
int for_what)
{
@@ -164,6 +175,18 @@
apr_pollfd_t pfd;
int type;
apr_status_t status;
+ apr_os_sock_t sock;
+
+ if (!con->pollset)
+ return APR_ENOPOLL;
+ if (!con->sock)
+ return APR_ENOTSOCK;
+
+ /* Check if the socket was already closed
+ */
+ apr_os_sock_get(&sock, con->sock);
+ if (sock == APR_INVALID_SOCKET)
+ return APR_ENOTSOCK;
/* Figure out the the poll direction */
switch (for_what) {
@@ -241,12 +264,13 @@
tcn_ssl_conn_t *con = (tcn_ssl_conn_t *)sock;
if (con->ssl) {
+ SSL *ssl = con->ssl;
+ con->ssl = NULL;
if (how < 1)
how = con->shutdown_type;
- rv = ssl_smart_shutdown(con->ssl, how);
+ rv = ssl_smart_shutdown(ssl, how);
/* TODO: Translate OpenSSL Error codes */
- SSL_free(con->ssl);
- con->ssl = NULL;
+ SSL_free(ssl);
}
return rv;
}
@@ -261,9 +285,10 @@
apr_atomic_inc32(&ssl_closed);
#endif
if (con->ssl) {
- rv = ssl_smart_shutdown(con->ssl, con->shutdown_type);
- SSL_free(con->ssl);
+ SSL *ssl = con->ssl;
con->ssl = NULL;
+ rv = ssl_smart_shutdown(ssl, con->shutdown_type);
+ SSL_free(ssl);
}
if (con->peer) {
X509_free(con->peer);
@@ -276,7 +301,7 @@
{
tcn_socket_t *ss = J2P(sock, tcn_socket_t *);
tcn_ssl_conn_t *con;
- int s;
+ int s, i;
apr_status_t rv;
X509 *peer;
@@ -287,7 +312,10 @@
con = (tcn_ssl_conn_t *)ss->opaque;
while (!SSL_is_init_finished(con->ssl)) {
if ((s = SSL_do_handshake(con->ssl)) <= 0) {
- int i = SSL_get_error(con->ssl, s);
+ apr_status_t os = apr_get_netos_error();
+ if (!con->ssl)
+ return os == APR_SUCCESS ? APR_ENOTSOCK : os;
+ i = SSL_get_error(con->ssl, s);
switch (i) {
case SSL_ERROR_NONE:
con->shutdown_type = SSL_SHUTDOWN_TYPE_STANDARD;
@@ -302,11 +330,10 @@
break;
case SSL_ERROR_SYSCALL:
case SSL_ERROR_SSL:
- s = apr_get_netos_error();
- if (!APR_STATUS_IS_EAGAIN(s) &&
- !APR_STATUS_IS_EINTR(s)) {
+ if (!APR_STATUS_IS_EAGAIN(os) &&
+ !APR_STATUS_IS_EINTR(os)) {
con->shutdown_type = SSL_SHUTDOWN_TYPE_UNCLEAN;
- return s;
+ return os;
}
break;
default:
@@ -318,6 +345,9 @@
break;
}
}
+ if (!con->ssl)
+ return APR_ENOTSOCK;
+
/*
* Check for failed client authentication
*/
@@ -344,13 +374,16 @@
ssl_socket_recv(apr_socket_t *sock, char *buf, apr_size_t *len)
{
tcn_ssl_conn_t *con = (tcn_ssl_conn_t *)sock;
- int s, wr = (int)(*len);
+ int s, i, wr = (int)(*len);
apr_status_t rv = APR_SUCCESS;
for (;;) {
if ((s = SSL_read(con->ssl, buf, wr)) <= 0) {
apr_status_t os = apr_get_netos_error();
- int i = SSL_get_error(con->ssl, s);
+ if (!con->ssl)
+ return os == APR_SUCCESS ? APR_ENOTSOCK : os;
+
+ i = SSL_get_error(con->ssl, s);
/* Special case if the "close notify" alert send by peer */
if (s == 0 && (con->ssl->shutdown & SSL_RECEIVED_SHUTDOWN)) {
*len = 0;
@@ -397,13 +430,16 @@
apr_size_t *len)
{
tcn_ssl_conn_t *con = (tcn_ssl_conn_t *)sock;
- int s, wr = (int)(*len);
+ int s, i, wr = (int)(*len);
apr_status_t rv = APR_SUCCESS;
for (;;) {
if ((s = SSL_write(con->ssl, buf, wr)) <= 0) {
apr_status_t os = apr_get_netos_error();
- int i = SSL_get_error(con->ssl, s);
+ if (!con->ssl)
+ return os == APR_SUCCESS ? APR_ENOTSOCK : os;
+
+ i = SSL_get_error(con->ssl, s);
switch (i) {
case SSL_ERROR_ZERO_RETURN:
*len = 0;
@@ -490,8 +526,14 @@
TCN_ASSERT(ctx != 0);
TCN_ASSERT(sock != 0);
+ if (!s->sock)
+ return APR_ENOTSOCK;
+
if ((rv = apr_os_sock_get(&oss, s->sock)) != APR_SUCCESS)
return rv;
+ if (oss == APR_INVALID_SOCKET)
+ return APR_ENOTSOCK;
+
if ((con = ssl_create(e, c, s->pool)) == NULL)
return APR_EGENERAL;
con->sock = s->sock;
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org