Re: Fwd: svn commit: r1445100 - in /httpd/httpd/branches/2.2.x: ./ CHANGES STATUS server/mpm_common.c

2013-02-12 Thread Rainer Jung
On 12.02.2013 12:43, Rüdiger Plüm wrote:
>   len = strlen(srequest);
> 
> Don't we need to remove this line as well? srequest is now data.

Oups, yes, sorry and thanks.

Fixed in r1445120.

Rainer



Fwd: svn commit: r1445100 - in /httpd/httpd/branches/2.2.x: ./ CHANGES STATUS server/mpm_common.c

2013-02-12 Thread Rüdiger Plüm



 Original Message 
Subject:svn commit: r1445100 - in /httpd/httpd/branches/2.2.x: ./ 
CHANGES STATUS server/mpm_common.c
Date:   Tue, 12 Feb 2013 10:54:42 GMT
From:   rj...@apache.org



Author: rjung
Date: Tue Feb 12 10:54:42 2013
New Revision: 1445100

URL: http://svn.apache.org/r1445100
Log:
server/mpm_unix.c (dummy_connection): Use a TLS 1.0 close_notify
alert if the chosen listener is configured for https; not perfect
but better than sending an HTTP request.  Adjust comments.

Backport of r1327036 and r1327080 from turnk,
resp. r1356884 from 2.4.x.

Submitted by: jorton
Reviewed by: covener, wrowe
Backported by: rjung

Modified:
 httpd/httpd/branches/2.2.x/   (props changed)
 httpd/httpd/branches/2.2.x/CHANGES
 httpd/httpd/branches/2.2.x/STATUS
 httpd/httpd/branches/2.2.x/server/mpm_common.c


Modified: httpd/httpd/branches/2.2.x/server/mpm_common.c
URL: 
http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/server/mpm_common.c?rev=1445100&r1=1445099&r2=1445100&view=diff
==
--- httpd/httpd/branches/2.2.x/server/mpm_common.c (original)
+++ httpd/httpd/branches/2.2.x/server/mpm_common.c Tue Feb 12 10:54:42 2013
@@ -636,14 +636,14 @@ static apr_status_t pod_signal_internal(
  return rv;
  }

-/* This function connects to the server, then immediately closes the 
connection.
- * This permits the MPM to skip the poll when there is only one listening
- * socket, because it provides a alternate way to unblock an accept() when
- * the pod is used.
- */
+/* This function connects to the server and sends enough data to
+ * ensure the child wakes up and processes a new connection.  This
+ * permits the MPM to skip the poll when there is only one listening
+ * socket, because it provides a alternate way to unblock an accept()
+ * when the pod is used.  */
  static apr_status_t dummy_connection(ap_pod_t *pod)
  {
-char *srequest;
+const char *data;
  apr_status_t rv;
  apr_socket_t *sock;
  apr_pool_t *p;
@@ -697,24 +697,38 @@ static apr_status_t dummy_connection(ap_
  return rv;
  }

-/* Create the request string. We include a User-Agent so that
- * adminstrators can track down the cause of the odd-looking
- * requests in their logs.
- */
-srequest = apr_pstrcat(p, "OPTIONS * HTTP/1.0\r\nUser-Agent: ",
+if (lp->protocol&&  strcasecmp(lp->protocol, "https") == 0) {
+/* Send a TLS 1.0 close_notify alert.  This is perhaps the
+ * "least wrong" way to open and cleanly terminate an SSL
+ * connection.  It should "work" without noisy error logs if
+ * the server actually expects SSLv3/TLSv1.  With
+ * SSLv23_server_method() OpenSSL's SSL_accept() fails
+ * ungracefully on receipt of this message, since it requires
+ * an 11-byte ClientHello message and this is too short. */
+static const unsigned char tls10_close_notify[7] = {
+'\x15', /* TLSPlainText.type = Alert (21) */
+'\x03', '\x01', /* TLSPlainText.version = {3, 1} */
+'\x00', '\x02', /* TLSPlainText.length = 2 */
+'\x01', /* Alert.level = warning (1) */
+'\x00'  /* Alert.description = close_notify (0) */
+};
+data = (const char *)tls10_close_notify;
+len = sizeof(tls10_close_notify);
+}
+else /* ... XXX other request types here? */ {
+/* Create an HTTP request string.  We include a User-Agent so
+ * that adminstrators can track down the cause of the
+ * odd-looking requests in their logs.  A complete request is
+ * used since kernel-level filtering may require that much
+ * data before returning from accept(). */
+data = apr_pstrcat(p, "OPTIONS * HTTP/1.0\r\nUser-Agent: ",
 ap_get_server_banner(),
 " (internal dummy connection)\r\n\r\n", NULL);
+len = strlen(data);
+}

-/* Since some operating systems support buffering of data or entire
- * requests in the kernel, we send a simple request, to make sure
- * the server pops out of a blocking accept().
- */
-/* XXX: This is HTTP specific. We should look at the Protocol for each
- * listener, and send the correct type of request to trigger any Accept
- * Filters.
- */
  len = strlen(srequest);

Don't we need to remove this line as well? srequest is now data.

-apr_socket_send(sock, srequest,&len);
+apr_socket_send(sock, data,&len);
  apr_socket_close(sock);
  apr_pool_destroy(p);