[master] c93f9bc6d Fix inconsequential memory leak in vcc_ParseHostDef()
Poul-Henning Kamp
phk at FreeBSD.org
Mon Nov 9 12:39:12 UTC 2020
commit c93f9bc6de6f246ba19a4c14ef7e0225b13cd86d
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Mon Nov 9 12:37:38 2020 +0000
Fix inconsequential memory leak in vcc_ParseHostDef()
diff --git a/lib/libvcc/vcc_backend.c b/lib/libvcc/vcc_backend.c
index 41674efd2..4a88eeb8b 100644
--- a/lib/libvcc/vcc_backend.c
+++ b/lib/libvcc/vcc_backend.c
@@ -348,7 +348,7 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
struct token *t_did = NULL;
struct fld_spec *fs;
struct inifin *ifp;
- struct vsb *vsb1, *vsb2;
+ struct vsb *vsb1;
char *p;
unsigned u;
double t;
@@ -366,15 +366,9 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
"?proxy_header",
NULL);
- vsb1 = VSB_new_auto();
- AN(vsb1);
- vsb2 = VSB_new_auto();
- AN(vsb2);
- tl->fb = vsb2;
if (tl->t->tok == ID &&
(vcc_IdIs(tl->t, "none") || vcc_IdIs(tl->t, "None"))) {
- Fb(tl, 0, "\n\t%s = (NULL);\n", vgcname);
vcc_NextToken(tl);
SkipToken(tl, ';');
ifp = New_IniFin(tl);
@@ -385,19 +379,6 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
SkipToken(tl, '{');
- VSB_printf(vsb1,
- "\nstatic const struct vrt_endpoint vgc_dir_ep_%s = {\n",
- vgcname);
- VSB_printf(vsb1, "\t.magic = VRT_ENDPOINT_MAGIC,\n");
-
- Fb(tl, 0, "\nstatic const struct vrt_backend vgc_dir_priv_%s = {\n",
- vgcname);
-
- Fb(tl, 0, "\t.magic = VRT_BACKEND_MAGIC,\n");
- Fb(tl, 0, "\t.endpoint = &vgc_dir_ep_%s,\n", vgcname);
- Fb(tl, 0, "\t.vcl_name = \"%.*s", PF(t_be));
- Fb(tl, 0, "\",\n");
-
/* Check for old syntax */
if (tl->t->tok == ID && vcc_IdIs(tl->t, "set")) {
VSB_cat(tl->sb,
@@ -410,6 +391,17 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
return;
}
+ tl->fb = VSB_new_auto();
+ AN(tl->fb);
+
+ Fb(tl, 0, "\nstatic const struct vrt_backend vgc_dir_priv_%s = {\n",
+ vgcname);
+
+ Fb(tl, 0, "\t.magic = VRT_BACKEND_MAGIC,\n");
+ Fb(tl, 0, "\t.endpoint = &vgc_dir_ep_%s,\n", vgcname);
+ Fb(tl, 0, "\t.vcl_name = \"%.*s", PF(t_be));
+ Fb(tl, 0, "\",\n");
+
while (tl->t->tok != '}') {
vcc_IsField(tl, &t_field, fs);
@@ -436,6 +428,7 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
vcc_ErrToken(tl, tl->t);
VSB_cat(tl->sb, " at ");
vcc_ErrWhere(tl, tl->t);
+ VSB_destroy(&tl->fb);
return;
}
vcc_Redef(tl, "Address", &t_did, t_field);
@@ -482,6 +475,7 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
VSB_cat(tl->sb,
".proxy_header must be 1 or 2\n");
vcc_ErrWhere(tl, t_val);
+ VSB_destroy(&tl->fb);
return;
}
SkipToken(tl, ';');
@@ -507,9 +501,11 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
vcc_ErrToken(tl, tl->t);
VSB_cat(tl->sb, " at\n");
vcc_ErrWhere(tl, tl->t);
+ VSB_destroy(&tl->fb);
return;
} else {
ErrInternal(tl);
+ VSB_destroy(&tl->fb);
return;
}
@@ -518,12 +514,22 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
vcc_FieldsOk(tl, fs);
ERRCHK(tl);
+ ExpectErr(tl, '}');
+
if (t_host == NULL && t_path == NULL) {
VSB_cat(tl->sb, "Expected .host or .path.\n");
vcc_ErrWhere(tl, t_be);
+ VSB_destroy(&tl->fb);
return;
}
+ vsb1 = VSB_new_auto();
+ AN(vsb1);
+ VSB_printf(vsb1,
+ "\nstatic const struct vrt_endpoint vgc_dir_ep_%s = {\n",
+ vgcname);
+ VSB_printf(vsb1, "\t.magic = VRT_ENDPOINT_MAGIC,\n");
+
assert(t_host != NULL || t_path != NULL);
if (t_host != NULL)
/* Check that the hostname makes sense */
@@ -533,9 +539,10 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
Emit_UDS_Path(tl, vsb1, t_path, "Backend path");
ERRCHK(tl);
- ExpectErr(tl, '}');
-
- /* We have parsed it all, emit the ident string */
+ VSB_printf(vsb1, "};\n");
+ AZ(VSB_finish(vsb1));
+ Fh(tl, 0, "%s", VSB_data(vsb1));
+ VSB_destroy(&vsb1);
/* Emit the hosthdr field, fall back to .host if not specified */
/* If .path is specified, set "0.0.0.0". */
@@ -553,15 +560,9 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
vcc_NextToken(tl);
- VSB_printf(vsb1, "};\n");
- AZ(VSB_finish(vsb1));
- Fh(tl, 0, "%s", VSB_data(vsb1));
- VSB_destroy(&vsb1);
-
- tl->fb = NULL;
- AZ(VSB_finish(vsb2));
- Fh(tl, 0, "%s", VSB_data(vsb2));
- VSB_destroy(&vsb2);
+ AZ(VSB_finish(tl->fb));
+ Fh(tl, 0, "%s", VSB_data(tl->fb));
+ VSB_destroy(&tl->fb);
ifp = New_IniFin(tl);
VSB_printf(ifp->ini,
More information about the varnish-commit
mailing list