Fwd: 1.17.5 regression

Maksim Yevmenkin maksim.yevmenkin at gmail.com
Thu Dec 19 17:01:10 UTC 2019


hello,

[...]

> > > > Thanks for the report, it indeed looks like a bug introduced
> > > > in 9d2ad2fb4423.
> > > >
> > > > The problem is that c->read->handler is overwritted when switching
> > > > to the next pipelined request, ngx_ssl_next_read_handler() is not
> > > > called, and c->read->ready remains not set.  I'll take a look how
> > > > to fix it properly.
> > >
> > > Thanks for having a look.
> > >
> > > Please keep me updated when the fix gets applied.

[...]

> Not really.  I meant the workaround in question won't work on
> systems with kqueue.  The problem itself is present with kqueue as
> well.

i suspect there is another instance of the same problem. it manifests
itself when nginx is reading reueqst over https, i.e. ngx_ssl_recv()
is interacting with ngx_http_process_request_line() and friends.
rev->handler gets overwritten, and, ngx_ssl_next_read_handler() never
gets called.

i wonder if SSL_pending(3) can be of value here, i.e.

==

@@ -2116,7 +2116,7 @@ ngx_ssl_recv_chain(ngx_connection_t *c,
ngx_chain_t *cl, off_t limit)
 ssize_t
 ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size)
 {
-    int  n, bytes;
+    int  n, bytes, pending;

 #ifdef SSL_READ_EARLY_DATA_SUCCESS
     if (c->ssl->in_early) {
@@ -2147,8 +2147,9 @@ ngx_ssl_recv(ngx_connection_t *c, u_char *buf,
size_t size)
     for ( ;; ) {

         n = SSL_read(c->ssl->connection, buf, size);
+        pending = SSL_pending(c->ssl->connection);

-        ngx_log_debug1(NGX_LOG_DEBUG_SSL, c->log, 0, "SSL_read: %d", n);
+        ngx_log_debug2(NGX_LOG_DEBUG_SSL, c->log, 0, "SSL_read: %d,
pending: %d", n, pending);

         if (n > 0) {
             bytes += n;
@@ -2161,8 +2162,13 @@ ngx_ssl_recv(ngx_connection_t *c, u_char *buf,
size_t size)
             size -= n;

             if (size == 0) {
-                c->read->ready = 1;
+                c->read->available = pending;
+                c->read->ready = !!(pending > 0);

+                ngx_log_debug1(NGX_LOG_DEBUG_SSL, c->log, 0,
+                               "SSL_read: avail:%d", c->read->available);
+

+#if 0
                 if (c->read->available >= 0) {
                     c->read->available -= bytes;

@@ -2203,6 +2209,7 @@ ngx_ssl_recv(ngx_connection_t *c, u_char *buf,
size_t size)

 #endif
                 }
+#endif

                 return bytes;
             }

===

thanks
max


More information about the nginx-devel mailing list