[master] 4e5fcfebf More proxy code cleanup thanks to VSA_BuildFAP
Nils Goroll
nils.goroll at uplex.de
Wed Apr 1 18:37:07 UTC 2020
commit 4e5fcfebf7028b9e5e32daf343f6a837fb3911ea
Author: Nils Goroll <nils.goroll at uplex.de>
Date: Thu Dec 12 15:55:18 2019 +0100
More proxy code cleanup thanks to VSA_BuildFAP
diff --git a/bin/varnishd/proxy/cache_proxy_proto.c b/bin/varnishd/proxy/cache_proxy_proto.c
index 53851a24c..b174f3142 100644
--- a/bin/varnishd/proxy/cache_proxy_proto.c
+++ b/bin/varnishd/proxy/cache_proxy_proto.c
@@ -323,7 +323,7 @@ vpx_proto2(const struct worker *wrk, struct req *req)
int l, hdr_len;
uintptr_t *up;
uint16_t tlv_len;
- const uint8_t *p;
+ const uint8_t *p, *ap, *pp;
char *d, *tlv_start;
sa_family_t pfam = 0xff;
struct suckaddr *sa = NULL;
@@ -333,6 +333,8 @@ vpx_proto2(const struct worker *wrk, struct req *req)
char pb[VTCP_PORTBUFSIZE];
struct vpx_tlv_iter vpi[1], vpi2[1];
struct vpx_tlv *tlv;
+ unsigned flen, alen;
+ unsigned const plen = 2, aoff = 16;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
@@ -378,46 +380,12 @@ vpx_proto2(const struct worker *wrk, struct req *req)
case 0x11:
/* IPv4|TCP */
pfam = AF_INET;
- if (l < 12) {
- VSL(SLT_ProxyGarbage, req->sp->vxid,
- "PROXY2: Ignoring short IPv4 addresses (%d)", l);
- return (0);
- }
- l -= 12;
- d += 12;
-
- /* dst/server */
- if (! SES_Reserve_server_addr(req->sp, &sa))
- return (vpx_ws_err(req));
- AN(VSA_BuildFAP(sa, pfam, p + 20, 4, p + 26, 2));
- VTCP_name(sa, ha, sizeof ha, pa, sizeof pa);
-
- /* src/client */
- if (! SES_Reserve_client_addr(req->sp, &sa))
- return (vpx_ws_err(req));
- AN(VSA_BuildFAP(sa, pfam, p + 16, 4, p + 24, 2));
+ alen = 4;
break;
case 0x21:
/* IPv6|TCP */
pfam = AF_INET6;
- if (l < 36) {
- VSL(SLT_ProxyGarbage, req->sp->vxid,
- "PROXY2: Ignoring short IPv6 addresses (%d)", l);
- return (0);
- }
- l -= 36;
- d += 36;
-
- /* dst/server */
- if (! SES_Reserve_server_addr(req->sp, &sa))
- return (vpx_ws_err(req));
- AN(VSA_BuildFAP(sa, pfam, p + 32, 16, p + 50, 2));
- VTCP_name(sa, ha, sizeof ha, pa, sizeof pa);
-
- /* src/client */
- if (! SES_Reserve_client_addr(req->sp, &sa))
- return (vpx_ws_err(req));
- AN(VSA_BuildFAP(sa, pfam, p + 16, 16, p + 48, 2));
+ alen = 16;
break;
default:
/* Ignore proxy header */
@@ -426,8 +394,36 @@ vpx_proto2(const struct worker *wrk, struct req *req)
return (0);
}
- AN(sa);
+ flen = 2 * alen + 2 * plen;
+
+ if (l < flen) {
+ VSL(SLT_ProxyGarbage, req->sp->vxid,
+ "PROXY2: Ignoring short %s addresses (%d)",
+ pfam == AF_INET ? "IPv4" : "IPv6", l);
+ return (0);
+ }
+
+ l -= flen;
+ d += flen;
+
+ ap = p + aoff;
+ pp = ap + 2 * alen;
+
+ /* src/client */
+ if (! SES_Reserve_client_addr(req->sp, &sa))
+ return (vpx_ws_err(req));
+ AN(VSA_BuildFAP(sa, pfam, ap, alen, pp, plen));
VTCP_name(sa, hb, sizeof hb, pb, sizeof pb);
+
+ ap += alen;
+ pp += plen;
+
+ /* dst/server */
+ if (! SES_Reserve_server_addr(req->sp, &sa))
+ return (vpx_ws_err(req));
+ AN(VSA_BuildFAP(sa, pfam, ap, alen, pp, plen));
+ VTCP_name(sa, ha, sizeof ha, pa, sizeof pa);
+
if (! SES_Set_String_Attr(req->sp, SA_CLIENT_IP, hb))
return (vpx_ws_err(req));
if (! SES_Set_String_Attr(req->sp, SA_CLIENT_PORT, pb))
More information about the varnish-commit
mailing list