Commit 365e02a8 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Directors, like all other code, should handle NULL BACKEND arguments

sanely, in this case by failing VCL initialization.

Fixes #2036
parent 51a1d5a8
varnishtest "NULL directors in vcl_init"
server s1 {
rxreq
txresp
} -start
varnish v1 -vcl+backend {} -start
varnish v1 -errvcl "NULL backend cannot be added" {
import directors;
probe cacheprobe {
.initial = 0;
}
backend b01 {
.host = "127.0.0.2";
.probe = cacheprobe;
}
sub vcl_init {
new hash = directors.hash();
hash.add_backend(b01,1.0);
new rr = directors.round_robin();
rr.add_backend(hash.backend("text"));
}
}
...@@ -122,7 +122,7 @@ vmod_fallback_add_backend(VRT_CTX, ...@@ -122,7 +122,7 @@ vmod_fallback_add_backend(VRT_CTX,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(fb, VMOD_DIRECTORS_FALLBACK_MAGIC); CHECK_OBJ_NOTNULL(fb, VMOD_DIRECTORS_FALLBACK_MAGIC);
(void)vdir_add_backend(fb->vd, be, 0.0); vdir_add_backend(ctx, fb->vd, be, 0.0);
} }
VCL_VOID __match_proto__() VCL_VOID __match_proto__()
...@@ -131,7 +131,7 @@ vmod_fallback_remove_backend(VRT_CTX, ...@@ -131,7 +131,7 @@ vmod_fallback_remove_backend(VRT_CTX,
{ {
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(fb, VMOD_DIRECTORS_FALLBACK_MAGIC); CHECK_OBJ_NOTNULL(fb, VMOD_DIRECTORS_FALLBACK_MAGIC);
vdir_remove_backend(fb->vd, be, &fb->cur); vdir_remove_backend(ctx, fb->vd, be, &fb->cur);
} }
VCL_BACKEND __match_proto__() VCL_BACKEND __match_proto__()
......
...@@ -81,7 +81,7 @@ vmod_hash_add_backend(VRT_CTX, ...@@ -81,7 +81,7 @@ vmod_hash_add_backend(VRT_CTX,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_HASH_MAGIC); CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_HASH_MAGIC);
(void)vdir_add_backend(rr->vd, be, w); vdir_add_backend(ctx, rr->vd, be, w);
} }
VCL_VOID __match_proto__() VCL_VOID __match_proto__()
...@@ -91,7 +91,7 @@ vmod_hash_remove_backend(VRT_CTX, ...@@ -91,7 +91,7 @@ vmod_hash_remove_backend(VRT_CTX,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_HASH_MAGIC); CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_HASH_MAGIC);
vdir_remove_backend(rr->vd, be, NULL); vdir_remove_backend(ctx, rr->vd, be, NULL);
} }
VCL_BACKEND __match_proto__() VCL_BACKEND __match_proto__()
......
...@@ -109,7 +109,7 @@ vmod_random_add_backend(VRT_CTX, ...@@ -109,7 +109,7 @@ vmod_random_add_backend(VRT_CTX,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_RANDOM_MAGIC); CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_RANDOM_MAGIC);
(void)vdir_add_backend(rr->vd, be, w); vdir_add_backend(ctx, rr->vd, be, w);
} }
VCL_VOID vmod_random_remove_backend(VRT_CTX, VCL_VOID vmod_random_remove_backend(VRT_CTX,
...@@ -117,7 +117,7 @@ VCL_VOID vmod_random_remove_backend(VRT_CTX, ...@@ -117,7 +117,7 @@ VCL_VOID vmod_random_remove_backend(VRT_CTX,
{ {
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_RANDOM_MAGIC); CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_RANDOM_MAGIC);
vdir_remove_backend(rr->vd, be, NULL); vdir_remove_backend(ctx, rr->vd, be, NULL);
} }
VCL_BACKEND __match_proto__() VCL_BACKEND __match_proto__()
......
...@@ -118,7 +118,7 @@ vmod_round_robin_add_backend(VRT_CTX, ...@@ -118,7 +118,7 @@ vmod_round_robin_add_backend(VRT_CTX,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_ROUND_ROBIN_MAGIC); CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_ROUND_ROBIN_MAGIC);
(void)vdir_add_backend(rr->vd, be, 0.0); vdir_add_backend(ctx, rr->vd, be, 0.0);
} }
VCL_VOID __match_proto__() VCL_VOID __match_proto__()
...@@ -127,7 +127,7 @@ vmod_round_robin_remove_backend(VRT_CTX, ...@@ -127,7 +127,7 @@ vmod_round_robin_remove_backend(VRT_CTX,
{ {
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_ROUND_ROBIN_MAGIC); CHECK_OBJ_NOTNULL(rr, VMOD_DIRECTORS_ROUND_ROBIN_MAGIC);
vdir_remove_backend(rr->vd, be, NULL); vdir_remove_backend(ctx, rr->vd, be, NULL);
} }
VCL_BACKEND __match_proto__() VCL_BACKEND __match_proto__()
......
...@@ -113,12 +113,16 @@ vdir_unlock(struct vdir *vd) ...@@ -113,12 +113,16 @@ vdir_unlock(struct vdir *vd)
} }
unsigned void
vdir_add_backend(struct vdir *vd, VCL_BACKEND be, double weight) vdir_add_backend(VRT_CTX, struct vdir *vd, VCL_BACKEND be, double weight)
{ {
unsigned u; unsigned u;
CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC); CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC);
if (be == NULL) {
VRT_fail(ctx, "NULL backend cannot be added");
return;
}
AN(be); AN(be);
vdir_wrlock(vd); vdir_wrlock(vd);
if (vd->n_backend >= vd->l_backend) if (vd->n_backend >= vd->l_backend)
...@@ -129,17 +133,18 @@ vdir_add_backend(struct vdir *vd, VCL_BACKEND be, double weight) ...@@ -129,17 +133,18 @@ vdir_add_backend(struct vdir *vd, VCL_BACKEND be, double weight)
vd->weight[u] = weight; vd->weight[u] = weight;
vd->total_weight += weight; vd->total_weight += weight;
vdir_unlock(vd); vdir_unlock(vd);
return (u);
} }
void void
vdir_remove_backend(struct vdir *vd, VCL_BACKEND be, unsigned *cur) vdir_remove_backend(VRT_CTX, struct vdir *vd, VCL_BACKEND be, unsigned *cur)
{ {
unsigned u, n; unsigned u, n;
CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC); CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC);
if (be == NULL) if (be == NULL) {
VRT_fail(ctx, "NULL backend cannot be removed");
return; return;
}
CHECK_OBJ(be, DIRECTOR_MAGIC); CHECK_OBJ(be, DIRECTOR_MAGIC);
vdir_wrlock(vd); vdir_wrlock(vd);
for (u = 0; u < vd->n_backend; u++) for (u = 0; u < vd->n_backend; u++)
......
...@@ -47,8 +47,8 @@ void vdir_delete(struct vdir **vdp); ...@@ -47,8 +47,8 @@ void vdir_delete(struct vdir **vdp);
void vdir_rdlock(struct vdir *vd); void vdir_rdlock(struct vdir *vd);
void vdir_wrlock(struct vdir *vd); void vdir_wrlock(struct vdir *vd);
void vdir_unlock(struct vdir *vd); void vdir_unlock(struct vdir *vd);
unsigned vdir_add_backend(struct vdir *, VCL_BACKEND be, double weight); void vdir_add_backend(VRT_CTX, struct vdir *, VCL_BACKEND, double weight);
void vdir_remove_backend(struct vdir *, VCL_BACKEND be, unsigned *cur); void vdir_remove_backend(VRT_CTX, struct vdir *, VCL_BACKEND, unsigned *cur);
unsigned vdir_any_healthy(struct vdir *, const struct busyobj *, unsigned vdir_any_healthy(struct vdir *, const struct busyobj *,
double *changed); double *changed);
VCL_BACKEND vdir_pick_be(struct vdir *, double w, const struct busyobj *); VCL_BACKEND vdir_pick_be(struct vdir *, double w, const struct busyobj *);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment