---
 bin/varnishd/storage/storage_persistent.c      |   23 +++---
 bin/varnishd/storage/storage_persistent.h      |   35 +++++++--
 bin/varnishd/storage/storage_persistent_silo.c |   10 +--
 bin/varnishd/storage/storage_persistent_subr.c |   90 ++++++++++++++++++++----
 4 files changed, 126 insertions(+), 32 deletions(-)

diff --git a/bin/varnishd/storage/storage_persistent.c 
b/bin/varnishd/storage/storage_persistent.c
index 5d31caf..b54f497 100644
--- a/bin/varnishd/storage/storage_persistent.c
+++ b/bin/varnishd/storage/storage_persistent.c
@@ -68,13 +68,14 @@ static VTAILQ_HEAD(,smp_sc) silos = 
VTAILQ_HEAD_INITIALIZER(silos);
  */
 
 static void
-smp_appendban(struct smp_sc *sc, struct smp_signctx *ctx,
+smp_appendban(struct smp_sc *sc, struct smp_signspace *spc,
     uint32_t len, const uint8_t *ban)
 {
        uint8_t *ptr, *ptr2;
 
        (void)sc;
-       ptr = ptr2 = SIGN_END(ctx);
+       ptr = ptr2 = SIGNSPACE_FRONT(spc);
+       assert(SIGNSPACE_FREE(spc) >= 4 + 4 + len);
 
        memcpy(ptr, "BAN", 4);
        ptr += 4;
@@ -85,7 +86,7 @@ smp_appendban(struct smp_sc *sc, struct smp_signctx *ctx,
        memcpy(ptr, ban, len);
        ptr += len;
 
-       smp_append_sign(ctx, ptr2, ptr - ptr2);
+       smp_append_signspace(spc, ptr - ptr2);
 }
 
 /* Trust that cache_ban.c takes care of locking */
@@ -106,7 +107,7 @@ SMP_NewBan(const uint8_t *ban, unsigned ln)
  */
 
 static int
-smp_open_bans(struct smp_sc *sc, struct smp_signctx *ctx)
+smp_open_bans(struct smp_sc *sc, struct smp_signspace *spc)
 {
        uint8_t *ptr, *pe;
        uint32_t length;
@@ -114,11 +115,11 @@ smp_open_bans(struct smp_sc *sc, struct smp_signctx *ctx)
 
        ASSERT_CLI();
        (void)sc;
-       i = smp_chk_sign(ctx);
+       i = smp_chk_signspace(spc);
        if (i)
                return (i);
-       ptr = SIGN_DATA(ctx);
-       pe = ptr + ctx->ss->length;
+       ptr = SIGNSPACE_DATA(spc);
+       pe = SIGNSPACE_FRONT(spc);
 
        while (ptr < pe) {
                if (memcmp(ptr, "BAN", 4)) {
@@ -148,7 +149,7 @@ smp_open_bans(struct smp_sc *sc, struct smp_signctx *ctx)
  */
 
 static int
-smp_open_segs(struct smp_sc *sc, struct smp_signctx *ctx)
+smp_open_segs(struct smp_sc *sc, struct smp_signspace *spc)
 {
        uint64_t length, l;
        struct smp_segptr *ss, *se;
@@ -156,12 +157,12 @@ smp_open_segs(struct smp_sc *sc, struct smp_signctx *ctx)
        int i, n = 0;
 
        ASSERT_CLI();
-       i = smp_chk_sign(ctx);
+       i = smp_chk_signspace(spc);
        if (i)
                return (i);
 
-       ss = SIGN_DATA(ctx);
-       length = ctx->ss->length;
+       ss = SIGNSPACE_DATA(spc);
+       length = SIGNSPACE_LEN(spc);
 
        if (length == 0) {
                /* No segments */
diff --git a/bin/varnishd/storage/storage_persistent.h 
b/bin/varnishd/storage/storage_persistent.h
index c817faf..ec97d3e 100644
--- a/bin/varnishd/storage/storage_persistent.h
+++ b/bin/varnishd/storage/storage_persistent.h
@@ -55,6 +55,21 @@ struct smp_signctx {
        const char              *id;
 };
 
+/*
+ * A space wrapped by a signature
+ *
+ * A signspace is a chunk of the silo that is wrapped by a
+ * signature. It has attributes for size, so range checking can be
+ * performed.
+ *
+ */
+
+struct smp_signspace {
+       struct smp_signctx      ctx;
+       uint8_t                 *start;
+       uint64_t                size;
+};
+
 struct smp_sc;
 
 /* XXX: name confusion with on-media version ? */
@@ -116,10 +131,10 @@ struct smp_sc {
        VTAILQ_ENTRY(smp_sc)    list;
 
        struct smp_signctx      idn;
-       struct smp_signctx      ban1;
-       struct smp_signctx      ban2;
-       struct smp_signctx      seg1;
-       struct smp_signctx      seg2;
+       struct smp_signspace    ban1;
+       struct smp_signspace    ban2;
+       struct smp_signspace    seg1;
+       struct smp_signspace    seg2;
 
        struct ban              *tailban;
 
@@ -161,6 +176,11 @@ struct smp_sc {
 #define SIGN_DATA(ctx) ((void *)((ctx)->ss + 1))
 #define SIGN_END(ctx)  ((void *)((int8_t *)SIGN_DATA(ctx) + (ctx)->ss->length))
 
+#define SIGNSPACE_DATA(spc)    (SIGN_DATA(&(spc)->ctx))
+#define SIGNSPACE_FRONT(spc)   (SIGN_END(&(spc)->ctx))
+#define SIGNSPACE_LEN(spc)     ((spc)->ctx.ss->length)
+#define SIGNSPACE_FREE(spc)    ((spc)->size - SIGNSPACE_LEN(spc))
+
 /* storage_persistent_mgt.c */
 
 void smp_mgt_init(struct stevedore *parent, int ac, char * const *av);
@@ -181,6 +201,13 @@ int smp_chk_sign(struct smp_signctx *ctx);
 void smp_append_sign(struct smp_signctx *ctx, const void *ptr, uint32_t len);
 void smp_reset_sign(struct smp_signctx *ctx);
 void smp_sync_sign(const struct smp_signctx *ctx);
+
+void smp_def_signspace(const struct smp_sc *sc, struct smp_signspace *spc,
+                      uint64_t off, uint64_t size, const char *id);
+int smp_chk_signspace(struct smp_signspace *spc);
+void smp_append_signspace(struct smp_signspace *spc, uint32_t len);
+void smp_reset_signspace(struct smp_signspace *spc);
+
 void smp_newsilo(struct smp_sc *sc);
 int smp_valid_silo(struct smp_sc *sc);
 
diff --git a/bin/varnishd/storage/storage_persistent_silo.c 
b/bin/varnishd/storage/storage_persistent_silo.c
index ff53af8..6ed80d2 100644
--- a/bin/varnishd/storage/storage_persistent_silo.c
+++ b/bin/varnishd/storage/storage_persistent_silo.c
@@ -58,15 +58,15 @@
  */
 
 static void
-smp_save_seg(const struct smp_sc *sc, struct smp_signctx *ctx)
+smp_save_seg(const struct smp_sc *sc, struct smp_signspace *spc)
 {
        struct smp_segptr *ss;
        struct smp_seg *sg;
        uint64_t length;
 
        Lck_AssertHeld(&sc->mtx);
-       smp_reset_sign(ctx);
-       ss = SIGN_DATA(ctx);
+       smp_reset_signspace(spc);
+       ss = SIGNSPACE_DATA(spc);
        length = 0;
        VTAILQ_FOREACH(sg, &sc->segments, list) {
                assert(sg->p.offset < sc->mediasize);
@@ -75,8 +75,8 @@ smp_save_seg(const struct smp_sc *sc, struct smp_signctx *ctx)
                ss++;
                length += sizeof *ss;
        }
-       smp_append_sign(ctx, SIGN_DATA(ctx), length);
-       smp_sync_sign(ctx);
+       smp_append_signspace(spc, length);
+       smp_sync_sign(&spc->ctx);
 }
 
 void
diff --git a/bin/varnishd/storage/storage_persistent_subr.c 
b/bin/varnishd/storage/storage_persistent_subr.c
index 004bba3..ac93544 100644
--- a/bin/varnishd/storage/storage_persistent_subr.c
+++ b/bin/varnishd/storage/storage_persistent_subr.c
@@ -179,6 +179,64 @@ smp_new_sign(const struct smp_sc *sc, struct smp_signctx 
*ctx,
 }
 
 /*--------------------------------------------------------------------
+ * Define a signature space by location, size and identifier
+ */
+
+void
+smp_def_signspace(const struct smp_sc *sc, struct smp_signspace *spc,
+                 uint64_t off, uint64_t size, const char *id)
+{
+       smp_def_sign(sc, &spc->ctx, off, id);
+       spc->start = SIGN_DATA(&spc->ctx);
+       spc->size = size - SMP_SIGN_SPACE;
+}
+
+/*--------------------------------------------------------------------
+ * Check that a signspace's signature space is good, leave state ready
+ * for append
+ */
+
+int
+smp_chk_signspace(struct smp_signspace *spc)
+{
+       return (smp_chk_sign(&spc->ctx));
+}
+
+/*--------------------------------------------------------------------
+ * Append data to a signature space
+ */
+
+void
+smp_append_signspace(struct smp_signspace *spc, uint32_t len)
+{
+       assert(len <= SIGNSPACE_FREE(spc));
+       smp_append_sign(&spc->ctx, SIGNSPACE_FRONT(spc), len);
+}
+
+/*--------------------------------------------------------------------
+ * Reset a signature space to empty, prepare for appending.
+ */
+
+void
+smp_reset_signspace(struct smp_signspace *spc)
+{
+       smp_reset_sign(&spc->ctx);
+}
+
+/*--------------------------------------------------------------------
+ * Create a new signature space and force the signature to backing store.
+ */
+
+static void
+smp_new_signspace(const struct smp_sc *sc, struct smp_signspace *spc,
+                 uint64_t off, uint64_t size, const char *id)
+{
+       smp_new_sign(sc, &spc->ctx, off, id);
+       spc->start = SIGN_DATA(&spc->ctx);
+       spc->size = size - SMP_SIGN_SPACE;
+}
+
+/*--------------------------------------------------------------------
  * Initialize a Silo with a valid but empty structure.
  *
  * XXX: more intelligent sizing of things.
@@ -220,10 +278,14 @@ smp_newsilo(struct smp_sc *sc)
        si->stuff[SMP_END_STUFF] = si->mediasize;
        assert(si->stuff[SMP_SPC_STUFF] < si->stuff[SMP_END_STUFF]);
 
-       smp_new_sign(sc, &sc->ban1, si->stuff[SMP_BAN1_STUFF], "BAN 1");
-       smp_new_sign(sc, &sc->ban2, si->stuff[SMP_BAN2_STUFF], "BAN 2");
-       smp_new_sign(sc, &sc->seg1, si->stuff[SMP_SEG1_STUFF], "SEG 1");
-       smp_new_sign(sc, &sc->seg2, si->stuff[SMP_SEG2_STUFF], "SEG 2");
+       smp_new_signspace(sc, &sc->ban1, si->stuff[SMP_BAN1_STUFF],
+                         smp_stuff_len(sc, SMP_BAN1_STUFF), "BAN 1");
+       smp_new_signspace(sc, &sc->ban2, si->stuff[SMP_BAN2_STUFF],
+                         smp_stuff_len(sc, SMP_BAN2_STUFF), "BAN 2");
+       smp_new_signspace(sc, &sc->seg1, si->stuff[SMP_SEG1_STUFF],
+                         smp_stuff_len(sc, SMP_SEG1_STUFF), "SEG 1");
+       smp_new_signspace(sc, &sc->seg2, si->stuff[SMP_SEG2_STUFF],
+                         smp_stuff_len(sc, SMP_SEG2_STUFF), "SEG 2");
 
        smp_append_sign(&sc->idn, si, sizeof *si);
        smp_sync_sign(&sc->idn);
@@ -282,20 +344,24 @@ smp_valid_silo(struct smp_sc *sc)
        assert(smp_stuff_len(sc, SMP_BAN1_STUFF) ==
          smp_stuff_len(sc, SMP_BAN2_STUFF));
 
-       smp_def_sign(sc, &sc->ban1, si->stuff[SMP_BAN1_STUFF], "BAN 1");
-       smp_def_sign(sc, &sc->ban2, si->stuff[SMP_BAN2_STUFF], "BAN 2");
-       smp_def_sign(sc, &sc->seg1, si->stuff[SMP_SEG1_STUFF], "SEG 1");
-       smp_def_sign(sc, &sc->seg2, si->stuff[SMP_SEG2_STUFF], "SEG 2");
+       smp_def_signspace(sc, &sc->ban1, si->stuff[SMP_BAN1_STUFF],
+                         smp_stuff_len(sc, SMP_BAN1_STUFF), "BAN 1");
+       smp_def_signspace(sc, &sc->ban2, si->stuff[SMP_BAN2_STUFF],
+                         smp_stuff_len(sc, SMP_BAN2_STUFF), "BAN 2");
+       smp_def_signspace(sc, &sc->seg1, si->stuff[SMP_SEG1_STUFF],
+                         smp_stuff_len(sc, SMP_SEG1_STUFF), "SEG 1");
+       smp_def_signspace(sc, &sc->seg2, si->stuff[SMP_SEG2_STUFF],
+                         smp_stuff_len(sc, SMP_SEG2_STUFF), "SEG 2");
 
        /* We must have one valid BAN table */
-       i = smp_chk_sign(&sc->ban1);
-       j = smp_chk_sign(&sc->ban2);
+       i = smp_chk_signspace(&sc->ban1);
+       j = smp_chk_signspace(&sc->ban2);
        if (i && j)
                return (100 + i * 10 + j);
 
        /* We must have one valid SEG table */
-       i = smp_chk_sign(&sc->seg1);
-       j = smp_chk_sign(&sc->seg2);
+       i = smp_chk_signspace(&sc->seg1);
+       j = smp_chk_signspace(&sc->seg2);
        if (i && j)
                return (200 + i * 10 + j);
        return (0);
-- 
1.7.9.5


_______________________________________________
varnish-dev mailing list
varnish-dev@varnish-cache.org
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev

Reply via email to