closed by adding an EOC bucket type:
* include/http_connection.h: Declare eoc bucket interface.
* server/eoc_bucket.c: New file.
* server/Makefile.in, libhttpd.dsp: Build eoc_bucket.c.
* server/core.c (core_output_filter): Delete EOC bucket.
* server/connection.c (ap_flush_conn): Send an EOC bucket.
* modules/ssl/ssl_engine_io.c (ssl_io_filter_output): Shutdown
the SSL connection for an EOC bucket.
(bio_filter_out_write): Conditionally disable buffering.
PR: 27428
Submitted by: Madhusudan Mathihalli
Reviewed by: Madhusudan Mathihalli, Justin Erenkrantz, Joe Orton
(sneaking in fixes for libhttpd.dsp and NWGNUMakefile)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/APACHE_2_0_BRANCH@102885
13f79535-47bb-0310-9956-
ffa450edef68
Changes with Apache 2.0.49
+ *) mod_ssl: Send the Close Alert message to the peer before closing
+ the SSL session. PR 27428. [Madhusudan Mathihalli, Joe Orton]
+
*) SECURITY: CAN-2004-0113 (cve.mitre.org)
mod_ssl: Fix a memory leak in plain-HTTP-on-SSL-port handling.
PR 27106. [Joe Orton]
$(OBJDIR)/config.o \
$(OBJDIR)/connection.o \
$(OBJDIR)/core.o \
+ $(OBJDIR)/eoc_bucket.o \
$(OBJDIR)/error_bucket.o \
$(OBJDIR)/http_core.o \
$(OBJDIR)/http_protocol.o \
APACHE 2.0 STATUS: -*-text-*-
-Last modified at [$Date: 2004/03/08 16:40:42 $]
+Last modified at [$Date: 2004/03/08 17:40:34 $]
Release:
http://cvs.apache.org/viewcvs.cgi/httpd-2.0/server/mpm/winnt/child.c?r1=1.29&r2=1.30
+1: stoddard, trawick, ake
- * mod_ssl: Send the Close Alert message to the peer before closing
- the SSL session.
- http://cvs.apache.org/viewcvs.cgi/httpd-2.0/include/http_connection.h?r1=1.59&r2=1.60
- http://cvs.apache.org/viewcvs.cgi/httpd-2.0/modules/ssl/ssl_engine_io.c?r1=1.118&r2=1.119
- http://cvs.apache.org/viewcvs.cgi/httpd-2.0/server/Makefile.in?r1=1.91&r2=1.92
- http://cvs.apache.org/viewcvs.cgi/httpd-2.0/server/connection.c?r1=1.114&r2=1.116
- http://cvs.apache.org/viewcvs.cgi/httpd-2.0/server/core.c?r1=1.261&r2=1.263
- http://cvs.apache.org/viewcvs.cgi/httpd-2.0/server/eoc_bucket.c (new file)
- PR: 27428
- +1: madhum, jerenkrantz, jorton
- (jorton: needs libhttpd.dsp change for Win32 too)
-
* mod_setenvif: remove support for remote_user variable which never
worked at all. PR 25725 (2.0 + 1.3)
modules/metadata/mod_setenvif.c: r1.50
*/
AP_DECLARE_HOOK(int,process_connection,(conn_rec *c))
+/* End Of Connection (EOC) bucket */
+
+AP_DECLARE_DATA extern const apr_bucket_type_t ap_bucket_type_eoc;
+
+/**
+ * Determine if a bucket is an End Of Connection (EOC) bucket
+ * @param e The bucket to inspect
+ * @return true or false
+ */
+#define AP_BUCKET_IS_EOC(e) (e->type == &ap_bucket_type_eoc)
+
+/**
+ * Make the bucket passed in an End Of Connection (EOC) bucket
+ * @param b The bucket to make into an EOC bucket
+ * @return The new bucket, or NULL if allocation failed
+ * @deffunc apr_bucket *ap_bucket_eoc_make(apr_bucket *b)
+ */
+AP_DECLARE(apr_bucket *) ap_bucket_eoc_make(apr_bucket *b);
+
+/**
+ * Create a bucket referring to an End Of Connection (EOC). This indicates
+ * that the connection will be closed.
+ * @param list The freelist from which this bucket should be allocated
+ * @return The new bucket, or NULL if allocation failed
+ * @deffunc apr_bucket *ap_bucket_eoc_create(apr_bucket_alloc_t *list)
+ */
+AP_DECLARE(apr_bucket *) ap_bucket_eoc_create(apr_bucket_alloc_t *list);
+
#ifdef __cplusplus
}
#endif
# PROP Default_Filter ""
# Begin Source File
+SOURCE=.\server\eoc_bucket.c
+# End Source File
+# Begin Source File
+
SOURCE=.\server\error_bucket.c
# End Source File
# Begin Source File
BIO *pbioWrite;
ap_filter_t *pInputFilter;
ap_filter_t *pOutputFilter;
+ int nobuffer; /* non-zero to prevent buffering */
} ssl_filter_ctx_t;
typedef struct {
*/
BIO_clear_retry_flags(bio);
- if (!outctx->length && (inl + outctx->blen < sizeof(outctx->buffer))) {
+ if (!outctx->length && (inl + outctx->blen < sizeof(outctx->buffer)) &&
+ !outctx->filter_ctx->nobuffer) {
/* the first two SSL_writes (of 1024 and 261 bytes)
* need to be in the same packet (vec[0].iov_base)
*/
apr_bucket_delete(bucket);
}
}
+ else if (AP_BUCKET_IS_EOC(bucket)) {
+ /* The special "EOC" bucket means a shutdown is needed;
+ * - turn off buffering in bio_filter_out_write
+ * - issue the SSL_shutdown
+ */
+ filter_ctx->nobuffer = 1;
+ status = ssl_filter_io_shutdown(filter_ctx, f->c, 0);
+ if (status != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_INFO, status, NULL,
+ "SSL filter error shutting down I/O");
+ }
+ if ((status = ap_pass_brigade(f->next, bb)) != APR_SUCCESS) {
+ return status;
+ }
+ break;
+ }
else {
/* filter output */
const char *data;
rfc1413.c connection.c listen.c \
mpm_common.c util_charset.c util_debug.c util_xml.c \
util_filter.c exports.c buildmark.c \
- scoreboard.c error_bucket.c protocol.c core.c request.c provider.c
+ scoreboard.c error_bucket.c protocol.c core.c request.c provider.c \
+ eoc_bucket.c
TARGETS = delete-exports $(LTLIBRARY_NAME) $(CORE_IMPLIB_FILE) export_vars.h httpd.exp
apr_bucket *b;
bb = apr_brigade_create(c->pool, c->bucket_alloc);
+
+ /* FLUSH bucket */
b = apr_bucket_flush_create(c->bucket_alloc);
APR_BRIGADE_INSERT_TAIL(bb, b);
+
+ /* End Of Connection bucket */
+ b = ap_bucket_eoc_create(c->bucket_alloc);
+ APR_BRIGADE_INSERT_TAIL(bb, b);
+
ap_pass_brigade(c->output_filters, bb);
}
if (APR_BUCKET_IS_EOS(e)) {
break;
}
- if (APR_BUCKET_IS_FLUSH(e)) {
+ if (AP_BUCKET_IS_EOC(e)) {
+ apr_bucket_delete(e);
+ }
+ else if (APR_BUCKET_IS_FLUSH(e)) {
if (e != APR_BRIGADE_LAST(b)) {
more = apr_brigade_split(b, APR_BUCKET_NEXT(e));
}