---
 bin/varnishd/cache/cache_ban.c |   24 ++++++++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c
index f44d98d..afc9861 100644
--- a/bin/varnishd/cache/cache_ban.c
+++ b/bin/varnishd/cache/cache_ban.c
@@ -116,6 +116,7 @@ static int ban_shutdown = 0;
 #define BANHEAD_O_LEN  8
 #define BANHEAD_O_FLAGS 12
 #define BANHEAD_LEN    13
+#define BANHEAD_LEN_TS  (BANHEAD_O_LEN)
 
 /*--------------------------------------------------------------------
  * BAN string magic markers
@@ -550,8 +551,10 @@ BAN_Reload(const uint8_t *ban, unsigned len)
        ASSERT_CLI();
        AZ(ban_shutdown);
 
+       assert(len >= BANHEAD_LEN || len == BANHEAD_LEN_TS);
+       if (len >= BANHEAD_LEN)
+               assert(len == ban_len(ban));
        t0 = ban_time(ban);
-       assert(len == ban_len(ban));
 
        Lck_Lock(&ban_mtx);
 
@@ -565,6 +568,9 @@ BAN_Reload(const uint8_t *ban, unsigned len)
                }
                if (t1 < t0)
                        break;
+               if (len == BANHEAD_LEN_TS)
+                       /* Truncated ban - don't check */
+                       continue;
                if (!memcmp(b->spec + BANHEAD_O_LEN, ban + BANHEAD_O_LEN,
                            len - BANHEAD_O_LEN))
                        duplicate = 1;
@@ -575,9 +581,19 @@ BAN_Reload(const uint8_t *ban, unsigned len)
 
        b2 = BAN_New();
        AN(b2);
-       b2->spec = malloc(len);
-       AN(b2->spec);
-       memcpy(b2->spec, ban, len);
+       if (len == BANHEAD_LEN_TS) {
+               /* Reload of truncated GONE ban, create an empty ban */
+               b2->spec = malloc(BANHEAD_LEN);
+               AN(b2->spec);
+               memcpy(b2->spec, ban, len);
+               b2->spec[BANHEAD_O_FLAGS] = 0;
+               vbe32enc(b2->spec + BANHEAD_O_LEN, BANHEAD_LEN);
+               b2->flags |= BAN_F_GONE;
+       } else {
+               b2->spec = malloc(len);
+               AN(b2->spec);
+               memcpy(b2->spec, ban, len);
+       }
        if (duplicate) {
                VSC_C_main->bans_dups++;
                b2->flags |= BAN_F_GONE;
-- 
1.7.9.5


_______________________________________________
varnish-dev mailing list
[email protected]
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev

Reply via email to