From: Alex Rousskov Date: Sun, 19 May 2013 02:34:11 +0000 (-0600) Subject: Fixed leaking configurable SSL error details. X-Git-Tag: SQUID_3_3_5~11 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fa6321c7033d763785d8fdb332a555bb274b1b71;p=thirdparty%2Fsquid.git Fixed leaking configurable SSL error details. Trunk r11496 "Configurable SSL error details messages" correctly disabled collection of HTTP statistics for non-HTTP header fields, such as configurable SSL error details. However, it also incorrectly disabled deletion of those non-HTTP header fields. Configurable SSL error details are only created during [re]configuration time, so the leak went unnoticed since 2011-06-17, but the same bug caused a major runtime annotation leak later (r12413) until the new annotation code was redesigned to avoid using HttpHeader (r12779). --- diff --git a/src/HttpHeader.cc b/src/HttpHeader.cc index abdc9f45d0..aed6647dd3 100644 --- a/src/HttpHeader.cc +++ b/src/HttpHeader.cc @@ -438,37 +438,37 @@ HttpHeader::clean() PROF_start(HttpHeaderClean); - /* - * An unfortunate bug. The entries array is initialized - * such that count is set to zero. httpHeaderClean() seems to - * be called both when 'hdr' is created, and destroyed. Thus, - * we accumulate a large number of zero counts for 'hdr' before - * it is ever used. Can't think of a good way to fix it, except - * adding a state variable that indicates whether or not 'hdr' - * has been used. As a hack, just never count zero-sized header - * arrays. - */ - if (owner <= hoReply) { + /* + * An unfortunate bug. The entries array is initialized + * such that count is set to zero. httpHeaderClean() seems to + * be called both when 'hdr' is created, and destroyed. Thus, + * we accumulate a large number of zero counts for 'hdr' before + * it is ever used. Can't think of a good way to fix it, except + * adding a state variable that indicates whether or not 'hdr' + * has been used. As a hack, just never count zero-sized header + * arrays. + */ if (0 != entries.count) HttpHeaderStats[owner].hdrUCountDistr.count(entries.count); ++ HttpHeaderStats[owner].destroyedCount; HttpHeaderStats[owner].busyDestroyedCount += entries.count > 0; + } // if (owner <= hoReply) - while ((e = getEntry(&pos))) { - /* tmp hack to try to avoid coredumps */ + while ((e = getEntry(&pos))) { + /* tmp hack to try to avoid coredumps */ - if (e->id < 0 || e->id >= HDR_ENUM_END) { - debugs(55, DBG_CRITICAL, "HttpHeader::clean BUG: entry[" << pos << "] is invalid (" << e->id << "). Ignored."); - } else { + if (e->id < 0 || e->id >= HDR_ENUM_END) { + debugs(55, DBG_CRITICAL, "HttpHeader::clean BUG: entry[" << pos << "] is invalid (" << e->id << "). Ignored."); + } else { + if (owner <= hoReply) HttpHeaderStats[owner].fieldTypeDistr.count(e->id); - /* yes, this deletion leaves us in an inconsistent state */ - delete e; - } + /* yes, this deletion leaves us in an inconsistent state */ + delete e; } - } // if (owner <= hoReply) + } entries.clean(); httpHeaderMaskInit(&mask, 0); len = 0;