[master] a6da61e fix vsc level filtering
Nils Goroll
nils.goroll at uplex.de
Mon Mar 5 14:52:09 UTC 2018
commit a6da61ede92da732d6215058f5a49c1c1d51b761
Author: Nils Goroll <nils.goroll at uplex.de>
Date: Mon Mar 5 15:46:16 2018 +0100
fix vsc level filtering
By imposing a fixed ordering on our levels structs, we ensure that pointers
to them are also ordered such that comparing two of them will compare as level
ordering.
Fixes #2587
diff --git a/lib/libvarnishapi/vsc.c b/lib/libvarnishapi/vsc.c
index 7df0858..0c243fe 100644
--- a/lib/libvarnishapi/vsc.c
+++ b/lib/libvarnishapi/vsc.c
@@ -96,14 +96,14 @@ struct vsc {
* Build the static level, type and point descriptions
*/
-#define VSC_LEVEL_F(v,l,e,d) \
- static const struct VSC_level_desc level_##v = {#v, l, e, d};
+enum vsc_levels {
+#define VSC_LEVEL_F(v,l,e,d) v,
#include "tbl/vsc_levels.h"
+};
-static const struct VSC_level_desc * const levels[] = {
-#define VSC_LEVEL_F(v,l,e,d) &level_##v,
+static const struct VSC_level_desc levels[] = {
+#define VSC_LEVEL_F(v,l,e,d) [v] = {#v, l, e, d},
#include "tbl/vsc_levels.h"
-#undef VSC_LEVEL_F
};
static const ssize_t nlevels = sizeof(levels)/sizeof(*levels);
@@ -266,11 +266,11 @@ vsc_fill_point(const struct vsc *vsc, const struct vsc_seg *seg,
assert(vt->type == VJSN_STRING);
if (!strcmp(vt->value, "info")) {
- point->point.level = &level_info;
+ point->point.level = &levels[info];
} else if (!strcmp(vt->value, "diag")) {
- point->point.level = &level_diag;
+ point->point.level = &levels[diag];
} else if (!strcmp(vt->value, "debug")) {
- point->point.level = &level_debug;
+ point->point.level = &levels[debug];
} else {
WRONG("Illegal level");
}
@@ -490,9 +490,9 @@ VSC_ChangeLevel(const struct VSC_level_desc *old, int chg)
int i;
if (old == NULL)
- old = levels[0];
+ old = &levels[0];
for (i = 0; i < nlevels; i++)
- if (old == levels[i])
+ if (old == &levels[i])
break;
if (i == nlevels)
i = 0;
@@ -502,7 +502,7 @@ VSC_ChangeLevel(const struct VSC_level_desc *old, int chg)
i = nlevels - 1;
if (i < 0)
i = 0;
- return (levels[i]);
+ return (&levels[i]);
}
/*--------------------------------------------------------------------*/
More information about the varnish-commit
mailing list