[4.1] fda295b Only add size of struct object when using default storeobj_methods

Martin Blix Grydeland martin at varnish-software.com
Mon Sep 28 13:31:07 CEST 2015


commit fda295b73341a762db28ed1d6441a0616efcbd88
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date:   Tue Sep 22 15:53:38 2015 +0200

    Only add size of struct object when using default storeobj_methods
    
    This is to not leak the size of struct object to stevedores that might
    have their own cache_obj.c implementation.

diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c
index 77a601c..0929ba8 100644
--- a/bin/varnishd/storage/stevedore.c
+++ b/bin/varnishd/storage/stevedore.c
@@ -219,12 +219,14 @@ STV_MkObject(const struct stevedore *stv, struct objcore *oc, void *ptr)
 
 int
 stv_default_allocobj(const struct stevedore *stv, struct objcore *oc,
-    unsigned ltot)
+    unsigned wsl)
 {
 	struct object *o;
 	struct storage *st;
+	unsigned ltot;
 
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
+	ltot = sizeof(struct object) + PRNDUP(wsl);
 	st = stv->alloc(stv, ltot);
 	if (st == NULL)
 		return (0);
@@ -250,24 +252,20 @@ STV_NewObject(struct objcore *oc, struct worker *wrk,
     const char *hint, unsigned wsl)
 {
 	struct stevedore *stv, *stv0;
-	unsigned ltot;
 	int i, j;
 
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	assert(wsl > 0);
-	wsl = PRNDUP(wsl);
-
-	ltot = sizeof(struct object) + wsl;
 
 	stv = stv0 = stv_pick_stevedore(wrk->vsl, &hint);
 	AN(stv->allocobj);
-	j = stv->allocobj(stv, oc, ltot);
+	j = stv->allocobj(stv, oc, wsl);
 	if (j == 0 && hint == NULL) {
 		do {
 			stv = stv_pick_stevedore(wrk->vsl, &hint);
 			AN(stv->allocobj);
-			j = stv->allocobj(stv, oc, ltot);
+			j = stv->allocobj(stv, oc, wsl);
 		} while (j == 0 && stv != stv0);
 	}
 	if (j == 0) {
@@ -275,7 +273,7 @@ STV_NewObject(struct objcore *oc, struct worker *wrk,
 		for (i = 0; j == 0 && i < cache_param->nuke_limit; i++) {
 			if (EXP_NukeOne(wrk, stv->lru) == -1)
 				break;
-			j = stv->allocobj(stv, oc, ltot);
+			j = stv->allocobj(stv, oc, wsl);
 		}
 	}
 
diff --git a/bin/varnishd/storage/storage_persistent.c b/bin/varnishd/storage/storage_persistent.c
index 160cc35..2679675 100644
--- a/bin/varnishd/storage/storage_persistent.c
+++ b/bin/varnishd/storage/storage_persistent.c
@@ -502,7 +502,7 @@ smp_allocx(const struct stevedore *st, size_t min_size, size_t max_size,
  */
 
 static int
-smp_allocobj(const struct stevedore *stv, struct objcore *oc, unsigned ltot)
+smp_allocobj(const struct stevedore *stv, struct objcore *oc, unsigned wsl)
 {
 	struct object *o;
 	struct storage *st;
@@ -510,6 +510,7 @@ smp_allocobj(const struct stevedore *stv, struct objcore *oc, unsigned ltot)
 	struct smp_seg *sg;
 	struct smp_object *so;
 	unsigned objidx;
+	unsigned ltot;
 
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	CAST_OBJ_NOTNULL(sc, stv->priv, SMP_SC_MAGIC);
@@ -518,6 +519,7 @@ smp_allocobj(const struct stevedore *stv, struct objcore *oc, unsigned ltot)
 	if ((oc->exp.ttl + oc->exp.grace + oc->exp.keep) <= 0.)
 		return (0);
 
+	ltot = sizeof(struct object) + PRNDUP(wsl);
 	ltot = IRNUP(sc, ltot);
 
 	st = smp_allocx(stv, ltot, ltot, &so, &objidx, &sg);



More information about the varnish-commit mailing list