Blame SOURCES/krb5-1.14.4-SNI-HTTP-Host.patch

8c1676
From 69c8662190bcd46f2300d0cea139681001ea5b26 Mon Sep 17 00:00:00 2001
8c1676
From: Christian Heimes <cheimes@redhat.com>
8c1676
Date: Mon, 8 Aug 2016 12:38:17 +0200
8c1676
Subject: [PATCH] Add Host HTTP header to MS-KKDCP requests
8c1676
8c1676
Some web servers require a Host HTTP header for TLS connections with
8c1676
SNI (server name indicator).  It is also required for virtual hosts.
8c1676
8c1676
ticket: 8472 (new)
8c1676
target_version: 1.14-next
8c1676
tags: pullup
8c1676
---
8c1676
 src/lib/krb5/os/sendto_kdc.c | 18 +++++++++++++-----
8c1676
 1 file changed, 13 insertions(+), 5 deletions(-)
8c1676
8c1676
diff --git a/src/lib/krb5/os/sendto_kdc.c b/src/lib/krb5/os/sendto_kdc.c
8c1676
index c85fdba..a2b7359 100644
8c1676
--- a/src/lib/krb5/os/sendto_kdc.c
8c1676
+++ b/src/lib/krb5/os/sendto_kdc.c
8c1676
@@ -78,6 +78,7 @@
8c1676
 #define MAX_PASS                    3
8c1676
 #define DEFAULT_UDP_PREF_LIMIT   1465
8c1676
 #define HARD_UDP_LIMIT          32700 /* could probably do 64K-epsilon ? */
8c1676
+#define PORT_LENGTH                 6 /* decimal repr of UINT16_MAX */
8c1676
 
8c1676
 /* Select state flags.  */
8c1676
 #define SSF_READ 0x01
8c1676
@@ -138,6 +139,7 @@ struct conn_state {
8c1676
     struct {
8c1676
         const char *uri_path;
8c1676
         const char *servername;
8c1676
+        char port[PORT_LENGTH];
8c1676
         char *https_request;
8c1676
         k5_tls_handle tls;
8c1676
     } http;
8c1676
@@ -611,6 +613,8 @@ make_proxy_request(struct conn_state *state, const krb5_data *realm,
8c1676
     k5_buf_init_dynamic(&buf;;
8c1676
     uri_path = (state->http.uri_path != NULL) ? state->http.uri_path : "";
8c1676
     k5_buf_add_fmt(&buf, "POST /%s HTTP/1.0\r\n", uri_path);
8c1676
+    k5_buf_add_fmt(&buf, "Host: %s:%s\r\n", state->http.servername,
8c1676
+                   state->http.port);
8c1676
     k5_buf_add(&buf, "Cache-Control: no-cache\r\n");
8c1676
     k5_buf_add(&buf, "Pragma: no-cache\r\n");
8c1676
     k5_buf_add(&buf, "User-Agent: kerberos/1.0\r\n");
8c1676
@@ -673,7 +677,7 @@ static krb5_error_code
8c1676
 add_connection(struct conn_state **conns, k5_transport transport,
8c1676
                krb5_boolean defer, struct addrinfo *ai, size_t server_index,
8c1676
                const krb5_data *realm, const char *hostname,
8c1676
-               const char *uri_path, char **udpbufp)
8c1676
+               const char *port, const char *uri_path, char **udpbufp)
8c1676
 {
8c1676
     struct conn_state *state, **tailptr;
8c1676
 
8c1676
@@ -695,11 +699,13 @@ add_connection(struct conn_state **conns, k5_transport transport,
8c1676
         state->service_write = service_tcp_write;
8c1676
         state->service_read = service_tcp_read;
8c1676
     } else if (transport == HTTPS) {
8c1676
+        assert(hostname != NULL && port != NULL);
8c1676
         state->service_connect = service_tcp_connect;
8c1676
         state->service_write = service_https_write;
8c1676
         state->service_read = service_https_read;
8c1676
         state->http.uri_path = uri_path;
8c1676
         state->http.servername = hostname;
8c1676
+        strlcpy(state->http.port, port, PORT_LENGTH);
8c1676
     } else {
8c1676
         state->service_connect = NULL;
8c1676
         state->service_write = NULL;
8c1676
@@ -785,7 +791,7 @@ resolve_server(krb5_context context, const krb5_data *realm,
8c1676
     struct addrinfo *addrs, *a, hint, ai;
8c1676
     krb5_boolean defer;
8c1676
     int err, result;
8c1676
-    char portbuf[64];
8c1676
+    char portbuf[PORT_LENGTH];
8c1676
 
8c1676
     /* Skip UDP entries if we don't want UDP. */
8c1676
     if (strategy == NO_UDP && entry->transport == UDP)
8c1676
@@ -800,7 +806,7 @@ resolve_server(krb5_context context, const krb5_data *realm,
8c1676
         ai.ai_addr = (struct sockaddr *)&entry->addr;
8c1676
         defer = (entry->transport != transport);
8c1676
         return add_connection(conns, entry->transport, defer, &ai, ind, realm,
8c1676
-                              NULL, entry->uri_path, udpbufp);
8c1676
+                              NULL, NULL, entry->uri_path, udpbufp);
8c1676
     }
8c1676
 
8c1676
     /* If the entry has a specified transport, use it. */
8c1676
@@ -826,7 +832,8 @@ resolve_server(krb5_context context, const krb5_data *realm,
8c1676
     retval = 0;
8c1676
     for (a = addrs; a != 0 && retval == 0; a = a->ai_next) {
8c1676
         retval = add_connection(conns, transport, FALSE, a, ind, realm,
8c1676
-                                entry->hostname, entry->uri_path, udpbufp);
8c1676
+                                entry->hostname, portbuf, entry->uri_path,
8c1676
+                                udpbufp);
8c1676
     }
8c1676
 
8c1676
     /* For TCP_OR_UDP entries, add each address again with the non-preferred
8c1676
@@ -836,7 +843,8 @@ resolve_server(krb5_context context, const krb5_data *realm,
8c1676
         for (a = addrs; a != 0 && retval == 0; a = a->ai_next) {
8c1676
             a->ai_socktype = socktype_for_transport(transport);
8c1676
             retval = add_connection(conns, transport, TRUE, a, ind, realm,
8c1676
-                                    entry->hostname, entry->uri_path, udpbufp);
8c1676
+                                    entry->hostname, portbuf,
8c1676
+                                    entry->uri_path, udpbufp);
8c1676
         }
8c1676
     }
8c1676
     freeaddrinfo(addrs);
8c1676
-- 
8c1676
2.8.1
8c1676