You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by wr...@apache.org on 2001/07/31 05:04:55 UTC
cvs commit: httpd-2.0/modules/ssl ssl_engine_io.c ssl_engine_kernel.c
wrowe 01/07/30 20:04:55
Modified: modules/ssl ssl_engine_io.c ssl_engine_kernel.c
Log:
- eliminated the use of ssl_log - it used to cause seg faults during cleanup
since the conn_rec will no longer be valid.
- eliminated the "for (;;)" processing loop in ssl_io_filter_Output() -
we'll have to do that in churn_output() if required, so that any remaining
OpenSSL data (if available) is transferred before we call the
CloseConnection.
- Any remaining data in SSL should be cleaned up ideally in the
APR_BUCKET_IS_EOS() processing stage itself, as we close the SSL connection
here.
Submitted by: Madhusudan Mathihalli <ma...@hp.com>
Reviewed by: William Rowe
Revision Changes Path
1.10 +18 -41 httpd-2.0/modules/ssl/ssl_engine_io.c
Index: ssl_engine_io.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/ssl/ssl_engine_io.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- ssl_engine_io.c 2001/07/24 19:00:12 1.9
+++ ssl_engine_io.c 2001/07/31 03:04:55 1.10
@@ -323,62 +323,30 @@
{
SSLFilterRec *pRec=f->ctx;
apr_bucket *pbktIn;
- conn_rec *c = SSL_get_app_data (pRec->pssl);
- if (!c) {
- /* if this happens we have already called ssl_hook_CloseConnection
- * if we dont return here, this routine will segv
- * XXX: this doesnt seem right, ssl_hook_CloseConnection probably
- * is being called to early, but as the README:TODO says:
- * "Cleanup ssl_engine_io.c !!"
- */
- return APR_EOF;
- }
-
APR_BRIGADE_FOREACH(pbktIn,pbbIn) {
const char *data;
apr_size_t len, n;
apr_status_t ret;
if(APR_BUCKET_IS_EOS(pbktIn)) {
- /* XXX: demote to debug */
- ssl_log(c->base_server, SSL_LOG_INFO, "EOS in output");
+ if ((ret = churn_output(pRec)) != APR_SUCCESS)
+ {
+ ap_log_error(
+ APLOG_MARK,APLOG_ERR,ret,NULL, "Error in churn_output");
+ return ret;
+ }
- if (ssl_hook_CloseConnection (pRec) != APR_SUCCESS)
- ssl_log(c->base_server, SSL_LOG_INFO,
+ if ((ret = ssl_hook_CloseConnection (pRec)) != APR_SUCCESS)
+ ap_log_error(APLOG_MARK,APLOG_ERR,ret,NULL,
"Error in ssl_hook_CloseConnection");
-#if 0
- /* XXX: dubious - does this always terminate? Does it return the right thing? */
- for( ; ; ) {
- ret=churn_output(pRec);
- if(ret != APR_SUCCESS)
- return ret;
- /* XXX - Verify if passing &len is okay for churn - TBD */
- len = 0;
- ret=churn(pRec,APR_NONBLOCK_READ,&len);
- if(ret != APR_SUCCESS) {
- if(ret == APR_EOF)
- return APR_SUCCESS;
- else
- return ret;
- }
- }
-#endif
break;
}
if(APR_BUCKET_IS_FLUSH(pbktIn)) {
- /* assume that churn will flush (or already has) if there's output */
- /* XXX - Verify if passing &len is okay for churn - TBD */
- ssl_log(c->base_server, SSL_LOG_INFO, "FLUSH in output");
- len = 0;
- ret=churn(pRec,APR_NONBLOCK_READ,&len);
- if(ret != APR_SUCCESS)
- return ret;
continue;
}
- ssl_log(c->base_server, SSL_LOG_INFO, "DATA in output");
/* read filter */
apr_bucket_read(pbktIn,&data,&len,APR_BLOCK_READ);
@@ -386,7 +354,6 @@
n = ssl_io_hook_write(pRec->pssl, (unsigned char *)data, len);
assert (n == len);
-
/* churn the state machine */
ret=churn_output(pRec);
if(ret != APR_SUCCESS)
@@ -421,6 +388,12 @@
return APR_SUCCESS;
}
+apr_status_t ssl_io_filter_cleanup (void *data)
+{
+ SSL *ssl = (SSL *)data;
+ return APR_SUCCESS;
+}
+
void ssl_io_filter_init(conn_rec *c, SSL *ssl)
{
SSLFilterRec *filter;
@@ -434,6 +407,10 @@
filter->pbioWrite = BIO_new(BIO_s_mem());
SSL_set_bio(ssl, filter->pbioRead, filter->pbioWrite);
filter->pssl = ssl;
+
+ apr_pool_cleanup_register(c->pool, (void*)ssl,
+ ssl_io_filter_cleanup, apr_pool_cleanup_null);
+
return;
}
1.12 +2 -0 httpd-2.0/modules/ssl/ssl_engine_kernel.c
Index: ssl_engine_kernel.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/ssl/ssl_engine_kernel.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- ssl_engine_kernel.c 2001/07/30 22:30:51 1.11
+++ ssl_engine_kernel.c 2001/07/31 03:04:55 1.12
@@ -397,7 +397,9 @@
* calls of Apache it would lead to an I/O error in the browser due
* to the fact that the SSL layer was already removed by us.
*/
+#if 0 /* XXX We've flush the OpenSSL buffer and not connection buffer - TBD */
ap_flush_conn(conn);
+#endif
/*
* Now close the SSL layer of the connection. We've to take