control: tags -1 pending

Uploaded
On Thu, 02 Aug 2012 14:47:31 +0200 Graham Inggs <graham.in...@uct.ac.za> wrote:
tags 679211 patch
thanks

Attached is a cherry-pick of changes in upstream revision 306 excluding those relating to more detailed debug logging and compiler warnings.
diff -u cntlm-0.92.3/debian/changelog cntlm-0.92.3/debian/changelog
--- cntlm-0.92.3/debian/changelog
+++ cntlm-0.92.3/debian/changelog
@@ -1,3 +1,14 @@
+cntlm (0.92.3-1.2) unstable; urgency=medium
+
+  [ Gianfranco Costamagna ]
+  * Non-maintainer upload
+
+  [ Graham Inggs ]
+  * Cherry-pick r306 from 0.93 to properly handle non-HTTP/1.1 keep-alive
+    (LP: #1009436 Closes: #679211)
+
+ -- Gianfranco Costamagna <locutusofb...@debian.org>  Sat, 30 Apr 2022 
15:19:17 +0200
+
 cntlm (0.92.3-1.1) unstable; urgency=medium
 
   * Non-maintainer upload.
only in patch2:
unchanged:
--- cntlm-0.92.3.orig/direct.c
+++ cntlm-0.92.3/direct.c
@@ -282,8 +282,19 @@
                                        data[0]->url = strdup(data[0]->rel_url);
                                }
 
-                               data[0]->headers = hlist_mod(data[0]->headers, 
"Connection", "keep-alive", 1);
-                               data[0]->headers = hlist_del(data[0]->headers, 
"Proxy-Authorization");
+                               /*
+                                * Force proxy keep-alive if the client can 
handle it (HTTP >= 1.1)
+                                */
+                               if (data[0]->http_version >= 11)
+                                       data[0]->headers = 
hlist_mod(data[0]->headers, "Connection", "keep-alive", 1);
+
+                               /*
+                                * Also remove runaway P-A from the client 
(e.g. Basic from N-t-B), which might 
+                                * cause some ISAs to deny us, even if the 
connection is already auth'd.
+                                */
+                               while (hlist_get(data[loop]->headers, 
"Proxy-Authorization")) {
+                                       data[loop]->headers = 
hlist_del(data[loop]->headers, "Proxy-Authorization");
+                               }
 
                                /*
                                 * Try to get auth from client if present
@@ -373,18 +384,25 @@
                         */
                        if (loop == 1) {
                                conn_alive = !hlist_subcmp(data[1]->headers, 
"Connection", "close")
-                                       && http_has_body(data[0], data[1]) != 
-1;
+                                       && http_has_body(data[0], data[1]) != -1
+                                       && data[0]->http_version >= 11;
                                if (conn_alive) {
                                        data[1]->headers = 
hlist_mod(data[1]->headers, "Proxy-Connection", "keep-alive", 1);
                                        data[1]->headers = 
hlist_mod(data[1]->headers, "Connection", "keep-alive", 1);
                                } else {
                                        data[1]->headers = 
hlist_mod(data[1]->headers, "Proxy-Connection", "close", 1);
+                                       data[1]->headers = 
hlist_mod(data[1]->headers, "Connection", "close", 1);
                                        rc = (void *)-1;
                                }
                        }
 
-                       if (debug)
+                       if (debug) {
                                printf("Sending headers (%d)...\n", 
*wsocket[loop]);
+                               if (loop == 0) {
+                                       printf("HEAD: %s %s %s\n", 
data[loop]->method, data[loop]->url, data[loop]->http);
+                                       hlist_dump(data[loop]->headers);
+                               }
+                       }
 
                        /*
                         * Send headers
only in patch2:
unchanged:
--- cntlm-0.92.3.orig/forward.c
+++ cntlm-0.92.3/forward.c
@@ -446,7 +446,9 @@
                                        && strcasecmp(hostname, 
data[0]->hostname)) {
                                if (debug)
                                        printf("\n******* F RETURN: %s 
*******\n", data[0]->url);
-                               if (authok)
+                               if (authok && data[0]->http_version >= 11
+                                               && 
(hlist_subcmp(data[0]->headers, "Proxy-Connection", "keep-alive")
+                                                       || 
hlist_subcmp(data[0]->headers, "Connection", "keep-alive")))
                                        proxy_alive = 1;
 
                                rc = dup_rr_data(data[0]);
@@ -465,7 +467,7 @@
                        /*
                         * Modify request headers.
                         *
-                        * Try to request keep-alive for every connection. We 
keep them in a pool
+                        * Try to request keep-alive for every client 
supporting HTTP/1.1+. We keep them in a pool
                         * for future reuse.
                         */
                        if (loop == 0 && data[0]->req) {
@@ -499,13 +501,14 @@
                                }
 
                                /*
-                                * Also remove runaway P-A from the client 
(e.g. Basic from N-t-B), which might 
-                                * cause some ISAs to deny us, even if the 
connection is already auth'd.
+                                * Force proxy keep-alive if the client can 
handle it (HTTP >= 1.1)
                                 */
-                               data[0]->headers = hlist_mod(data[0]->headers, 
"Proxy-Connection", "keep-alive", 1);
+                               if (data[0]->http_version >= 11)
+                                       data[0]->headers = 
hlist_mod(data[0]->headers, "Proxy-Connection", "keep-alive", 1);
 
                                /*
-                                * Remove all Proxy-Authorization headers from 
client
+                                * Also remove runaway P-A from the client 
(e.g. Basic from N-t-B), which might 
+                                * cause some ISAs to deny us, even if the 
connection is already auth'd.
                                 */
                                while (hlist_get(data[loop]->headers, 
"Proxy-Authorization")) {
                                        data[loop]->headers = 
hlist_del(data[loop]->headers, "Proxy-Authorization");
@@ -672,8 +675,14 @@
                         * This way, we also tell our caller that proxy 
keep-alive is impossible.
                         */
                        if (loop == 1) {
-                               proxy_alive = hlist_subcmp(data[loop]->headers, 
"Proxy-Connection", "keep-alive");
-                               if (!proxy_alive) {
+                               proxy_alive = hlist_subcmp(data[1]->headers, 
"Proxy-Connection", "keep-alive")
+                                       && data[0]->http_version >= 11;
+                               if (proxy_alive) {
+                                       data[1]->headers = 
hlist_mod(data[1]->headers, "Proxy-Connection", "keep-alive", 1);
+                                       data[1]->headers = 
hlist_mod(data[1]->headers, "Connection", "keep-alive", 1);
+                               } else {
+                                       data[1]->headers = 
hlist_mod(data[1]->headers, "Proxy-Connection", "close", 1);
+                                       data[1]->headers = 
hlist_mod(data[1]->headers, "Connection", "close", 1);
                                        if (debug)
                                                printf("PROXY CLOSING 
CONNECTION\n");
                                        rc = (void *)-1;
only in patch2:
unchanged:
--- cntlm-0.92.3.orig/http.c
+++ cntlm-0.92.3/http.c
@@ -84,7 +84,7 @@
  */
 int headers_recv(int fd, rr_data_t data) {
        int i, bsize;
-       int len;
+       int len, is_http = 0;
        char *buf;
        char *tok, *s3 = 0;
        char *orig = NULL;
@@ -108,12 +108,22 @@
        orig = strdup(buf);
        len = strlen(buf);
        tok = strtok_r(buf, " ", &s3);
-       if (tok && (!strncasecmp(buf, "HTTP/", 5) || !strncasecmp(tok, "ICY", 
3))) {
+       if (tok && ((is_http = !strncasecmp(tok, "HTTP/", 5)) || 
!strncasecmp(tok, "ICY", 3))) {
                data->req = 0;
                data->empty = 0;
                data->http = strdup(tok);
                data->msg = NULL;
 
+               /*
+                * Let's find out the numeric version of the HTTP version: 09, 
10, 11.
+                * Set to -1 if header is misformatted.
+                */
+               if (is_http && (tok = strchr(data->http, '/')) && strlen(tok) 
>= 4 && isdigit(tok[1]) && isdigit(tok[3])) {
+                       data->http_version = (tok[1] - 0x30) * 10 + (tok[3] - 
0x30);
+               } else {
+                       data->http_version = -1;
+               }
+
                tok = strtok_r(NULL, " ", &s3);
                if (tok) {
                        ccode = strdup(tok);
@@ -156,6 +166,16 @@
                        goto bailout;
                }
 
+               /*
+                * Let's find out the numeric version of the HTTP version: 09, 
10, 11.
+                * Set to -1 if header is misformatted.
+                */
+               if ((tok = strchr(data->http, '/')) && strlen(tok) >= 4 && 
isdigit(tok[1]) && isdigit(tok[3])) {
+                       data->http_version = (tok[1] - 0x30) * 10 + (tok[3] - 
0x30);
+               } else {
+                       data->http_version = -1;
+               }
+
                if ((tok = strstr(data->url, "://"))) {
                        tok += 3;
                } else {
only in patch2:
unchanged:
--- cntlm-0.92.3.orig/utils.c
+++ cntlm-0.92.3/utils.c
@@ -508,6 +508,7 @@
        data->body_len = 0;
        data->empty = 1;
        data->port = 0;
+       data->http_version = -1;
        data->headers = NULL;
        data->method = NULL;
        data->url = NULL;
@@ -535,6 +536,7 @@
        dst->body_len = src->body_len;
        dst->empty = src->empty;
        dst->port = src->port;
+       dst->http_version = src->http_version;
 
        if (src->headers)
                dst->headers = hlist_dup(src->headers);
@@ -584,6 +586,7 @@
        data->body_len = 0;
        data->empty = 1;
        data->port = 0;
+       data->http_version = -1;
 
        if (data->headers) hlist_free(data->headers);
        if (data->method) free(data->method);
@@ -623,6 +626,7 @@
        if (data->http) free(data->http);
        if (data->msg) free(data->msg);
        if (data->body) free(data->body);
+       memset(data, 0, sizeof(struct rr_data_s));
        free(data);
 }
 
only in patch2:
unchanged:
--- cntlm-0.92.3.orig/utils.h
+++ cntlm-0.92.3/utils.h
@@ -89,6 +89,7 @@
        int body_len;
        int empty;
        int port;
+       int http_version;
        char *method;
        char *url;
        char *rel_url;

Reply via email to