]> git.kaiwu.me - nginx.git/commitdiff
SSL: fixed possible use-after-free in $ssl_server_name.
authorMaxim Dounin <mdounin@mdounin.ru>
Tue, 22 Aug 2017 14:36:12 +0000 (17:36 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Tue, 22 Aug 2017 14:36:12 +0000 (17:36 +0300)
The $ssl_server_name variable used SSL_get_servername() result directly,
but this is not safe: it references a memory allocation in an SSL
session, and this memory might be freed at any time due to renegotiation.
Instead, copy the name to memory allocated from the pool.

src/event/ngx_event_openssl.c

index 4b74cb3f24e319c6f7c362ee051518c74d1e048b..88a6dbed3146f32376b39b24f6a23f73465b64b4 100644 (file)
@@ -3551,13 +3551,22 @@ ngx_ssl_get_server_name(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)
 {
 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
 
-    const char  *servername;
+    size_t       len;
+    const char  *name;
+
+    name = SSL_get_servername(c->ssl->connection, TLSEXT_NAMETYPE_host_name);
+
+    if (name) {
+        len = ngx_strlen(name);
+
+        s->len = len;
+        s->data = ngx_pnalloc(pool, len);
+        if (s->data == NULL) {
+            return NGX_ERROR;
+        }
+
+        ngx_memcpy(s->data, name, len);
 
-    servername = SSL_get_servername(c->ssl->connection,
-                                    TLSEXT_NAMETYPE_host_name);
-    if (servername) {
-        s->data = (u_char *) servername;
-        s->len = ngx_strlen(servername);
         return NGX_OK;
     }