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,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_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__()
......@@ -131,7 +131,7 @@ vmod_fallback_remove_backend(VRT_CTX,
{
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_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__()
......
......@@ -81,7 +81,7 @@ vmod_hash_add_backend(VRT_CTX,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_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__()
......@@ -91,7 +91,7 @@ vmod_hash_remove_backend(VRT_CTX,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_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__()
......
......@@ -109,7 +109,7 @@ vmod_random_add_backend(VRT_CTX,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_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,
......@@ -117,7 +117,7 @@ VCL_VOID vmod_random_remove_backend(VRT_CTX,
{
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_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__()
......
......@@ -118,7 +118,7 @@ vmod_round_robin_add_backend(VRT_CTX,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_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__()
......@@ -127,7 +127,7 @@ vmod_round_robin_remove_backend(VRT_CTX,
{
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_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__()
......
......@@ -113,12 +113,16 @@ vdir_unlock(struct vdir *vd)
}
unsigned
vdir_add_backend(struct vdir *vd, VCL_BACKEND be, double weight)
void
vdir_add_backend(VRT_CTX, struct vdir *vd, VCL_BACKEND be, double weight)
{
unsigned u;
CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC);
if (be == NULL) {
VRT_fail(ctx, "NULL backend cannot be added");
return;
}
AN(be);
vdir_wrlock(vd);
if (vd->n_backend >= vd->l_backend)
......@@ -129,17 +133,18 @@ vdir_add_backend(struct vdir *vd, VCL_BACKEND be, double weight)
vd->weight[u] = weight;
vd->total_weight += weight;
vdir_unlock(vd);
return (u);
}
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;
CHECK_OBJ_NOTNULL(vd, VDIR_MAGIC);
if (be == NULL)
if (be == NULL) {
VRT_fail(ctx, "NULL backend cannot be removed");
return;
}
CHECK_OBJ(be, DIRECTOR_MAGIC);
vdir_wrlock(vd);
for (u = 0; u < vd->n_backend; u++)
......
......@@ -47,8 +47,8 @@ void vdir_delete(struct vdir **vdp);
void vdir_rdlock(struct vdir *vd);
void vdir_wrlock(struct vdir *vd);
void vdir_unlock(struct vdir *vd);
unsigned vdir_add_backend(struct vdir *, VCL_BACKEND be, double weight);
void vdir_remove_backend(struct vdir *, VCL_BACKEND be, unsigned *cur);
void vdir_add_backend(VRT_CTX, struct vdir *, VCL_BACKEND, double weight);
void vdir_remove_backend(VRT_CTX, struct vdir *, VCL_BACKEND, unsigned *cur);
unsigned vdir_any_healthy(struct vdir *, const struct busyobj *,
double *changed);
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