[squid-users] Squid 3.5.16 and vary loop objects (bug ?)
Amos Jeffries
squid3 at treenet.co.nz
Wed Apr 6 14:05:55 UTC 2016
On 7/04/2016 1:20 a.m., joe wrote:
> amos
>
> vary.length() = 33
> vary.c_str() = accept-encoding="gzip,%20deflate"
> so without +1 is fine
>
Nod. What I'm thinking is that old Squid versions saved the string
terminator byte to the cache entries, and builds with the +1 replicate
that. BuUT that is being loaded back as part of the string (counted in
length). So the compare against the new un-terminated strings now fails
due to different lengths (off-by-1) and re-saving it to disk might make
length +2 (and +3 on the next cycle etc).
Attached is a patch which I think will fix 3.5.16 (should apply fine on
4.0.8 too) without needing the cache reset. Anyone able to test it please?
Amos
-------------- next part --------------
=== modified file 'src/StoreMetaVary.cc'
--- src/StoreMetaVary.cc 2016-04-01 06:15:31 +0000
+++ src/StoreMetaVary.cc 2016-04-06 13:18:55 +0000
@@ -22,6 +22,9 @@
/* XXX separate this mutator from the query */
/* Assume the object is OK.. remember the vary request headers */
e->mem_obj->vary_headers.assign(static_cast<const char *>(value), length);
+ /* entries created before SBuf vary handling may include string terminator */
+ static const SBuf nul("\0", 1);
+ e->mem_obj->vary_headers.trim(nul);
return true;
}
=== modified file 'src/store_swapmeta.cc'
--- src/store_swapmeta.cc 2016-04-01 06:15:31 +0000
+++ src/store_swapmeta.cc 2016-04-06 12:03:43 +0000
@@ -89,9 +89,7 @@
SBuf vary(e->mem_obj->vary_headers);
if (!vary.isEmpty()) {
- // TODO: do we still need +1 here? StoreMetaVary::checkConsistency
- // no longer relies on nul-termination, but other things might.
- t = StoreMeta::Factory(STORE_META_VARY_HEADERS, vary.length() + 1, vary.c_str());
+ t = StoreMeta::Factory(STORE_META_VARY_HEADERS, vary.length(), vary.c_str());
if (!t) {
storeSwapTLVFree(TLV);
More information about the squid-users
mailing list