]> git.ipfire.org Git - thirdparty/squid.git/log
thirdparty/squid.git
3 years agoCleanup dependencies for testEvent unit test (#886)
Amos Jeffries [Thu, 19 Aug 2021 04:56:04 +0000 (04:56 +0000)] 
Cleanup dependencies for testEvent unit test (#886)

Many objects linked to the testEvent unit test were there for
legacy reasons and no longer needed.

Converting Event::dump() to Packable interface additionally
removes all dependency on the Store and StoreEntry API. Vastly
simplifying the complexity of the test setup and clarifying
(lack of) code coverage by this test.

3 years agoFix build on OpenBSD (#885)
Francesco Chemolli [Sun, 15 Aug 2021 16:00:10 +0000 (16:00 +0000)] 
Fix build on OpenBSD (#885)

On OpenBSD 6.9, SOL_SOCKET is defined in sys/socket.h.

3 years agoext_lm_group_acl: Improved username handling (#884)
Nikita [Fri, 13 Aug 2021 21:50:07 +0000 (21:50 +0000)] 
ext_lm_group_acl: Improved username handling (#884)

Ensure that NTDomain is terminated even if UserName is long.
It happened to be terminated in the current code, but only by accident.

3 years agoBug 4922: Improve ftp://... filename extraction (#879)
Alex Rousskov [Thu, 12 Aug 2021 12:23:43 +0000 (12:23 +0000)] 
Bug 4922: Improve ftp://... filename extraction (#879)

Symptoms include: Unexpected ERR_FTP_NOT_FOUND/FTP_REPLY_CODE=550
outcome for GET ftp://... requests with URLs containing `;type=...`.

Broken since commit 51b5dcf.

3 years agoActivate extra compiler checks (#667)
Francesco Chemolli [Thu, 12 Aug 2021 08:39:04 +0000 (08:39 +0000)] 
Activate extra compiler checks (#667)

If the compiler supports it, add the `-Wextra` compiler flag to enable
extra checks. Do not enable extra checks with GCC v4 because that old
GCC version reports too many false positives.

Explicitly disable those `-Wextra` checks that offer few insights while
creating a lot of noise which cannot be easily avoided.

Fix warnings reported by GCC or clang with the new settings.

Rework syslog-related code in debug.cc, making it clearer and with less
dependencies on some syslog levels.

3 years agoSupport "file" syntax for 'squid_error' and 'has' ACL parameters (#874)
Eduard Bagdasaryan [Wed, 4 Aug 2021 22:04:38 +0000 (22:04 +0000)] 
Support "file" syntax for 'squid_error' and 'has' ACL parameters (#874)

The 'squid_error' and 'has' are the only ACLs that do not support
loading their parameters from a file using the "path/filename" syntax.
We see no justification for this exception, and it stands in the way of
(unrelated) configuration improvements we are working on (that will,
among other things, prevent such accidents from happening again).

This change causes no upgrade problems because it does not change
handling of previously accepted configurations. It only expands the set
of acceptable configurations, better matching documentation and admin
expectations with regard to universal "path/filename" syntax support.

3 years agoFix TCP keepalive (#853)
Amos Jeffries [Sun, 1 Aug 2021 12:58:25 +0000 (12:58 +0000)] 
Fix TCP keepalive (#853)

Setting TCP keep-alive flags at accept(2) time resolves issues with
client sockets timing out while waiting for the ::Server handler to run.

Also resolves a bug with FTP DATA connections not having keep-alive set.
These connections would truncate objects if the data transfer connection
paused for too long and became timed out by the network routing system.

3 years agoFix doc/debug-messages.dox generation (#871)
Eduard Bagdasaryan [Fri, 30 Jul 2021 16:11:08 +0000 (16:11 +0000)] 
Fix doc/debug-messages.dox generation (#871)

cache_log_message ID 62 was missing from doc/debug-messages.dox because
the code generating that file did not recognize debugs() statements with
Critical() or Important() macro inside a conditional operator.

Also fixed a related sed regex: sed does not support non-greedy matches.

No runtime functionality changes.

3 years agoPrep for 5.1 (#868)
Amos Jeffries [Wed, 28 Jul 2021 16:54:11 +0000 (16:54 +0000)] 
Prep for 5.1 (#868)

documentation only.

3 years agoRemove legacy context-based debugging in favor of CodeContext (#866)
Alex Rousskov [Wed, 28 Jul 2021 12:21:45 +0000 (12:21 +0000)] 
Remove legacy context-based debugging in favor of CodeContext (#866)

Added in 1998, context-based debugging has been neglected and

- only covers two relatively small contexts
- unsafe in the presence of exceptions
- produces noise (e.g., "ctx: exit level 0" messages)
- delayed "ctx: exit" messages confuse admins
- uses deprecated urlXXX() API
- difficult to extend to more contexts without performance overheads
- usually provides less info in fewer contexts (than CodeContext)

3 years agoCleanup macros in src/defines.h (#860)
Amos Jeffries [Sun, 25 Jul 2021 19:42:12 +0000 (19:42 +0000)] 
Cleanup macros in src/defines.h (#860)

Reduce compile unit dependencies on src/defines.h by moving some
src/defines.h macros to their most-relevant header.

Also remove all src/defines.h macros known to be unused.

3 years agoAllow sending "squid -k ..." signals to PID 1 (#863)
Jonathan Newton [Fri, 23 Jul 2021 07:03:26 +0000 (07:03 +0000)] 
Allow sending "squid -k ..." signals to PID 1 (#863)

Inside a container, Squid usually runs with PID=1. Since "squid -k"
feature was added in 1996 (commit 7690e8e), Squid refused to signal a
PID=1 instance. We do not know why, and it could have been an accident.
We cannot find a good reason to keep prohibiting such signalling.

3 years agoReject different HTTP requests with unusual framing (#753)
Amos Jeffries [Tue, 20 Jul 2021 19:01:40 +0000 (19:01 +0000)] 
Reject different HTTP requests with unusual framing (#753)

... and remove support for request_entities.

Squid now follows the following (approximate) rules when checking HTTP
request framing. The first matching rule wins.

* HTTP requests with a Transfer-Encoding:chunked header, including GET
  and HEAD requests with that header, are accepted. No changes here.

* HTTP requests with unsupported Transfer-Encoding values are rejected
  (Squid replies with HTTP 501 "Not Implemented"). No changes here.

* HTTP requests having conflicting Content-Length values are rejected
  (Squid replies with HTTP 400 "Bad Request"). No changes here.

* HTTP/1.0 and HTTP/0.9 POST and PUT requests without a valid
  Content-Length header are now rejected (Squid replies with HTTP 411
  "Length Required"). All of these were allowed before.

* HTTP/1.0 GET and HEAD requests with a Content-Length:0 header are now
  rejected (Squid replies with HTTP 400 "Bad Request"). All of these
  were allowed before.

* HTTP/1.0 GET and HEAD requests with a positive Content-Length header
  are now rejected (Squid replies with HTTP 400 "Bad Request"). All of
  these were allowed before if and only if the request_entities
  directive was explicitly set to "on".

There are no other framing-related HTTP request restrictions. Prior to
these changes, HTTP/1.1 GET and HEAD requests with a positive
Content-Length header were rejected unless the request_entities
directive was explicitly set to "on". The following configuration sketch
keeps rejecting those requests:

    acl getOrHead method GET HEAD
    acl withContentLength req_header Content-Length .
    http_access deny getOrHead withContentLength

The new restrictions were added due to possibility of cache corruption
attacks and other security issues related to HTTP request framing.

The request_entities directive was removed to simplify decision logic.

Some developers believe that these changes should be accompanied by
configuration options that allow admins to bypass (most of) the
previously absent restrictions. However, these developers do not know of
any important use cases that these changes break, and such cases may not
even exist. The authors insist on these security-driven changes.

3 years agoRefactor X-Forwarded-For stats (#834)
Francesco Chemolli [Thu, 15 Jul 2021 21:45:04 +0000 (21:45 +0000)] 
Refactor X-Forwarded-For stats (#834)

Use std::unordered_map instead of hash_table
Clean up unused code
Rename a few functions to better reflect name

Test plan:

$ squidclient mgr:forw_headers
HTTP/1.1 200 OK
Server: squid/6.0.0-VCS

       10 foo
       15 baz
        7 bar

3 years agoRemove bogus "found KEY_PRIVATE" WARNINGs (#862)
Alex Rousskov [Thu, 15 Jul 2021 05:58:19 +0000 (05:58 +0000)] 
Remove bogus "found KEY_PRIVATE" WARNINGs (#862)

... triggered by private bumped StoreEntry unlock()ed in ~ServerBump().

The WARNINGs were added long time ago (commit fc8b9fc) because, AFAICT,
earlier Store code expected StoreEntry owners to release() uncachable
entries, including KEY_PRIVATE ones, right before unlocking them.
However, there is no compile-time enforcement of that expectation, and
unlocking code does not always know whether the entry is cachable (as
ServerBump constructor/destructor RAII code illustrates).

This change stops tying release and unlocking decisions/actions together
but makes sure that idle KEY_PRIVATE entries are still released (because
we do not want to index unneeded/unusable Store entries).

3 years agoFix SslBump reconfiguration leaking public key memory (#861)
Alex Rousskov [Mon, 12 Jul 2021 20:59:02 +0000 (20:59 +0000)] 
Fix SslBump reconfiguration leaking public key memory (#861)

X509_get_pubkey() increments key reference count.

Probably leaking since commit 2a268a0.

3 years agoFix ACL-related reconfiguration memory leak (#859)
Alex Rousskov [Sun, 11 Jul 2021 19:24:14 +0000 (19:24 +0000)] 
Fix ACL-related reconfiguration memory leak (#859)

Leaking since commit 4eac340 that migrated from statically-allocated
ACLStrategy<...>::Instance_ objects to dynamically allocated ones.

Most ACLStrategy objects have no data members, probably leaking just one
virtual table pointer (per named ACL), but strategies that support ACL
(data) --options, like ACLDestinationDomainStrategy and
ACLServerNameStrategy, leak memory used for options storage.

3 years agoBug 4696: Fix leaky String move assignment operator (#858)
Alex Rousskov [Fri, 9 Jul 2021 15:32:33 +0000 (15:32 +0000)] 
Bug 4696: Fix leaky String move assignment operator (#858)

The original attempt at fixing String move assignment operator (i.e.
commit 20a04c1) leaked the assigned-to String object memory.

These leaks are measurable even in --disable-optimizations builds.

3 years agoFix build on RISC-V (#856)
Heinrich Schuchardt [Thu, 8 Jul 2021 17:06:49 +0000 (17:06 +0000)] 
Fix build on RISC-V (#856)

Compiling on RISC-V (without an explicit -latomic) fails with

    /usr/riscv64-linux-gnu/include/c++/10/ostream:611:
    undefined reference to __atomic_compare_exchange_1

Use std::atomic<uint8_t>::exchange() to detect whether -latomic
implements 1-byte compare-and-exchange API used by Squid.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
3 years agoFix build on Ubuntu 21 (#855)
Heinrich Schuchardt [Thu, 8 Jul 2021 03:25:48 +0000 (03:25 +0000)] 
Fix build on Ubuntu 21 (#855)

The `-Wunused-result` warning for setuid(0) call was observed on Ubuntu
21.04 (when cross compiling Squid for Ubuntu 21.10).

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
3 years agoFix socket accounting for TCP accept() (#854)
Amos Jeffries [Mon, 5 Jul 2021 14:55:29 +0000 (14:55 +0000)] 
Fix socket accounting for TCP accept() (#854)

The incoming_sockets_accepted counter is used by Comm I/O modules to
count the number of successfully accept()ed FDs during a single
select(2) (or equivalent) scan of ready descriptors. For TCP
connections, the official code incremented that counter in the async
TcpAcceptor callbacks. Those callbacks run outside the counting Comm I/O
context, rendering counter increments useless and resulting in
under-reporting of actual acceptance activity.

Also, some successfully accepted TCP connections fire no callbacks, so
it is conceptually wrong to count accepted sockets in callbacks,
regardless of the timing problems.

4 years agoRelese Prep for 4.16 and 5.0.7 (#850)
Amos Jeffries [Fri, 2 Jul 2021 14:26:59 +0000 (14:26 +0000)] 
Relese Prep for 4.16 and 5.0.7 (#850)

Documentation only

4 years agoSSL_SESSION::master_key cannot be falsy (#848)
Francesco Chemolli [Thu, 24 Jun 2021 22:13:23 +0000 (22:13 +0000)] 
SSL_SESSION::master_key cannot be falsy (#848)

SSL_SESSION::master_key data member is an array. It cannot be falsy.

This fixes clang -Wpointer-bool-conversion.

4 years agoSource Format Enforcement (#845)
squidadm [Thu, 17 Jun 2021 18:10:24 +0000 (18:10 +0000)] 
Source Format Enforcement (#845)

4 years agoFix ClpMap build error on arm32 (#844)
Francesco Chemolli [Thu, 17 Jun 2021 05:07:57 +0000 (05:07 +0000)] 
Fix ClpMap build error on arm32 (#844)

    static_assert ... "Sum() return type can fit its (unsigned) result"
    in ClpMap member instantiation inside sslCrtvdHandleReplyWrapper()

Honor Sum<T>() caller's explicit request to use a specific accumulation
type T instead of guessing the right type for inner sum iterations
(based on the second, third, etc. arguments) and hitting static
assertions when those guesses were wrong because some of those arguments
used types smaller than T.

This fix also allows Sum() callers to avoid explicit T when the first
argument is already the largest one. Callers should not be forced to be
explicit at all, but computing the largest type is a complex known TODO
outside this fix scope.

4 years agoFix sslcrtd and external_acl helper name lifetimes (#843)
Alex Rousskov [Wed, 16 Jun 2021 07:30:29 +0000 (07:30 +0000)] 
Fix sslcrtd and external_acl helper name lifetimes (#843)

    helperShutdown: <binary garbage> #Hlpr523 shutting down.
    helperShutdown: See example.net/legal-terms #Hlpr4456 shutting down.

Busy "class helper" objects often outlive configuration that was used to
create them. Ideally, the supplied helper category name should be copied
and maintained by the helper object itself, but that long-term solution
requires a lot more work (TODO) due to out-of-scope bugs.

4 years agoReconfiguration orphans stateless helper connection (#842)
Alex Rousskov [Fri, 11 Jun 2021 22:26:31 +0000 (22:26 +0000)] 
Reconfiguration orphans stateless helper connection (#842)

The helper.cc code (ab)uses two different Connection objects with the
same FD. Properly fixing that problem requires significant work, but the
official code almost gets away with it, in part, because helper.cc, with
one exception, uses heavily customized code to "safely" close its
connections (instead of just calling conn->close() as many Squid jobs
still do). This fix replaces that single exceptional case with a
closeWritePipeSafely() call which prevents orphaning readPipe and
triggering BUG 3329 warnings. It also restores the symmetry between the
corresponding (previously buggy) stateless and (OK) statefull code.

A code merge mistake in commit b038892 created this bug AFAICT.

4 years agocache_log_message directive (#775)
Eduard Bagdasaryan [Fri, 11 Jun 2021 13:24:04 +0000 (13:24 +0000)] 
cache_log_message directive (#775)

This directive controls cache.log printing of important messages.

Rationale: In any given deployment environment, many of the cache.log
messages that Squid logs by default are noise. Some of them should
probably never be logged by default, but some are useful or even
critical in certain other environments. No single approach to logging is
going to satisfy all needs. The existing debug_options directive
operates on large message groups and is not suitable for controlling
individual critical or important messages.

The current implementation uses hard-coded manually-assigned opaque
message IDs. We have also experimented with an automated generation of
message IDs, including meaningful IDs and compiler-generated IDs created
by various advanced C++ preprocessing and template tricks. All of the
automation considered (and some partially implemented) were rejected
for being overall worse than the current manual approach.

TODO: The usefulness of ID ranges will diminish with time. We could
support named (hard-coded) sets of message IDs (e.g., "startup",
"shutdown", and "configuration"). However, sets make it easier to
accidentally suppress an important new message during an upgrade.

4 years agoMaintenance: Update astyle version to 3.1 (#841)
Amos Jeffries [Fri, 11 Jun 2021 09:28:25 +0000 (09:28 +0000)] 
Maintenance: Update astyle version to 3.1 (#841)

Version 2.04 is quite outdated now, and there are only minor
formatting differences with v3.1. All changes look to be good syntax.

Also, pass the astyle executable with command line option to
formater.pl. Avoiding environment variables which do not work on servers
with sanitized sub-shell environments such as our main server.

4 years agoRemove custom global new/delete operators (#839)
Francesco Chemolli [Sun, 6 Jun 2021 15:36:45 +0000 (15:36 +0000)] 
Remove custom global new/delete operators (#839)

These custom operators did not cover all new/delete cases (e.g., array
allocations), were not declared according to C++ standards (triggering
compiler warnings), and were not enabled in clang builds.

These customizations enabled custom OOM handling (for covered cases),
but it is not clear whether that feature is desirable overall, and C++
has better ways to implement such handling (i.e. set_new_handler()).

These customizations participated in collection of optional statistics
(--enable-xmalloc-statistics), but it is not clear whether that feature
implementation is good enough, and, even if it is, providing these
partial stats does not outweigh recurring customization problems.

4 years agoRemove unused code silencing intercept errors (#836)
Amos Jeffries [Fri, 4 Jun 2021 00:05:30 +0000 (00:05 +0000)] 
Remove unused code silencing intercept errors (#836)

The removed code has not been actively used almost since it was added.

It is now widely accepted that NAT and TPROXY can only be done on the
machine running Squid. The corresponding address lookup errors are an
indication of either a system misconfiguration or an adverse external
event such as flushing of conntrack tables. Since these errors should be
fatal to the affected transactions and the admin usually has the power
to address them, Squid should report them at level 1.

4 years agoAvoid "BUG #3329: Lost orphan ..." during accept problems (#780)
Eduard Bagdasaryan [Mon, 31 May 2021 17:32:48 +0000 (17:32 +0000)] 
Avoid "BUG #3329: Lost orphan ..." during accept problems (#780)

Comm::TcpAcceptor creates a Comm::Connection with an open FD. Lots of
things could go wrong while that connection object travels to its
intended owner (e.g., Ftp::Server). A Connection object abandoned during
that travel will auto-close, triggering level-4 "BUG #3329" messages.

TODO: The manual enter/leaveOrphanage() tracking is unreliable. We need
to design and implement a true connection ownership concept that does
not require such tracking. These changes highlight handover spots.

Also made a few TcpAcceptor members protected to reduce the chance of
missing a Connection recipient (i.e. TcpAcceptor subscriber). Most of
these members should be (at least) protected for other reasons as well.

4 years agoRefactor Via stats to replace hash_table with std::unordered_map (#829)
Francesco Chemolli [Fri, 28 May 2021 18:19:54 +0000 (18:19 +0000)] 
Refactor Via stats to replace hash_table with std::unordered_map (#829)

4 years agoRemove a lot of unwanted ifdef'd out code (#826) 4.15-20210527-snapshot 5.0.6-20210527-snapshot 6.0.0-20210527-master-snapshot
Francesco Chemolli [Wed, 26 May 2021 13:59:53 +0000 (13:59 +0000)] 
Remove a lot of unwanted ifdef'd out code (#826)

We examined most `#if...` clauses and removed those we decided are
clearly unwanted now. Most of the removed code snippets were unused for
many years or represented stale ideas. We tried to check (at least
superficially) all clauses, but most likely missed some good candidates.

4 years agoAdd tls_key_log to report TLS communication secrets (#759) 458/head
Alex Rousskov [Mon, 24 May 2021 20:02:52 +0000 (20:02 +0000)] 
Add tls_key_log to report TLS communication secrets (#759)

The new log is meant for triage using traffic inspection tools like
Wireshark. Also known as SSLKEYLOGFILE, it is a common feature across
TLS-capable applications. By default, the new feature is disabled and
has negligible performance impact.

We have rejected the idea of adding an access_log %code instead, as
detailed in squid-dev thread titled "RFC: tls_key_log: report TLS
pre-master secrets, other key material". Such %code can still be added.
http://lists.squid-cache.org/pipermail/squid-dev/2020-July/009605.html

----

Generalized StoreClient::fillChecklist() API into Acl::ChecklistFiller

Code that establishes TLS connections outsources logging of secrets to
Security::KeyLogger. Security::KeyLogger::shouldLog() must consult
tls_key_log ACLs before logging the secrets but it does not know much
about the code/context that delegated this logging to KeyLogger. That
code could fill the checklist in advance, but that is an inferior
solution because it

* prevents outsourcing a rather mundane responsibility to KeyLogger
* creates a potentially stale Checklist, not reflecting TLS progress
* wastes resources on filling a checklist that may not be needed

While adding ConnStateData::fillChecklist() and looking through
ConnStateData code for examples on how to fill a checklist, it became
clear that there is a lot of code duplication in this area, including
some subtle problems with various checklist.foo assignments possibly
missing in some places (it is difficult to know for sure because some
checklist methods may extract the same information from _multiple_
sources). For example,

* on_unsupported_protocol and ssl_bump ignored acl_uses_indirect_client
* ident_lookup_access and delay_pool_access lacked port info and
  other ConnStateData details beyond src/dst addresses

Now, most of that duplicated code is replaced with unified
fillChecklist() calls. This unification is a significant improvement
that provides additional justification for the fillChecklist() design.

Also renamed ACLFilledChecklist::conn() to setConn(). Renaming is not
necessary for the compiler but will help detect no longer necessary
conn() setting calls when this code is ported to other Squid versions.

4 years agoBug 4528: ICAP transactions quit on async DNS lookups (#795) 4.15-20210525-snapshot 5.0.6-20210525-snapshot 6.0.0-20210525-master-snapshot
Alex Rousskov [Fri, 21 May 2021 18:47:36 +0000 (18:47 +0000)] 
Bug 4528: ICAP transactions quit on async DNS lookups (#795)

The bug directly affected some ICAP OPTIONS transactions and indirectly
affected some ICAP REQMOD/RESPMOD transactions:

* OPTIONS: When a transaction needed to look up an IP address of the
  ICAP service, and that address was not cached by Squid, it ended
  prematurely because Adaptation::Icap::Xaction::doneAll() was unaware
  of ipcache_nbgethostbyname()'s async nature. This bug is fixed now.

* REQMOD/RESPMOD: Adaptation::Icap::ModXact masked the _direct_ effects
  of the bug: ModXact::startWriting() sets state.writing before calling
  openConnection() which schedules the DNS lookup. That "I am still
  writing" state makes ModXact::doneAll() false while a REQMOD or
  RESPMOD transaction waits for the DNS lookup.

  However, REQMOD and RESPMOD transactions that require an OPTIONS
  transaction (because the service options have never been fetched
  before or have expired) could still fail because the OPTIONS
  transaction they trigger could fail as described in the first bullet.
  For example, the first few REQMOD and RESPMOD transactions for a given
  service -- all those started before the DNS lookup completes and Squid
  caches its result -- could fail this way. With the OPTIONS now fixed,
  these REQMOD and RESPMOD transactions should work correctly.

Broken since inception (commit fb505fa).

4 years agoMake CustomLog more reusable (#824)
Alex Rousskov [Thu, 20 May 2021 03:11:17 +0000 (03:11 +0000)] 
Make CustomLog more reusable (#824)

The future tls_key_log directive supports most access_log features but
should not inherit deprecated configuration styles, multi-directive
support complications, and legacy top-level configuration parsing code.
The shared/reusable bits were extracted from CustomLog and cache_cf.cc
functions into the new FormattedLog class. Some of them were polished.

All existing access_log/etc. directives continue to use CustomLog, so
nothing in the code justifies FormattedLog existence right now.

Fixed at least these old bugs:

* access_log config dumps were missing the destination parameter
* "access_log none" config dump included a bogus "logformat=none" option
* "access_log buffer-size=..." config dump were missing size units
* built-in logformat re-definition check missed the "icap_squid" format
* "access_log rotate=N" accepted (but then ignored) negative N values
* "access_log rotate=N" was stored as short but dumped as full integer

Admin-visible changes:

* access_log key=value strings are now case sensitive. This change
  improves consistency with squid.conf directives that are all case
  sensitive and most other directive options. The logformat name was
  already case sensitive. I see no good reason to keep this undocumented
  exception.

4 years agoBug 4832: '!schemeAccess' assertion on exit (#819) 4.15-20210522-snapshot 4.15-20210523-snapshot 4.15-20210524-snapshot 5.0.6-20210522-snapshot 5.0.6-20210523-snapshot 5.0.6-20210524-snapshot 6.0.0-20210522-master-snapshot 6.0.0-20210523-master-snapshot 6.0.0-20210524-master-snapshot
Amos Jeffries [Wed, 19 May 2021 11:37:34 +0000 (11:37 +0000)] 
Bug 4832: '!schemeAccess' assertion on exit (#819)

* Add test to detect the bug and prevent regressions

* delete the access list if not cleared by the time
  Auth::Config instance is destructed. This is what the
  free_AuthSchemes() code does when the function call
  nesting and debugs are pruned away.

4 years agoBug 5129 pt1: remove Lock use from HttpRequestMethod (#825)
Amos Jeffries [Mon, 17 May 2021 08:10:33 +0000 (08:10 +0000)] 
Bug 5129 pt1: remove Lock use from HttpRequestMethod (#825)

Removes the need for a custom assignment operator with a questionable
implementation, addressing compiler and static analysis warnings.

4 years agoSimplified Http::Message::parse() (#814)
Joshua Rogers [Mon, 17 May 2021 03:43:48 +0000 (03:43 +0000)] 
Simplified Http::Message::parse() (#814)

size_t hdr_len cannot be negative, and sanityCheckStartLine() already
rejects zero values. We now use (and clearly document) the latter fact.

Also replaced a level-1 warning about "Too large" headers with a level-3
debugging message because huge headers is not a Squid problem, and the
problem should already be visible in access.logs records.

4 years agoFix --with-valgrind-debug build broken by commit 02f5357 (#822)
Alex Rousskov [Sun, 16 May 2021 22:31:30 +0000 (22:31 +0000)] 
Fix --with-valgrind-debug build broken by commit 02f5357 (#822)

    error: cbdata_htable was not declared in this scope

4 years agoBug 5128: Translation: Fix % i typo in es/ERR_FORWARDING_DENIED (#821)
Alex Rousskov [Thu, 13 May 2021 17:27:44 +0000 (17:27 +0000)] 
Bug 5128: Translation: Fix % i typo in es/ERR_FORWARDING_DENIED (#821)

    | ERROR: .../es/ERR_FORWARDING_DENIED: Unsupported error page %code
    near % i es un...

Typo added in bbeb83f.

4 years agoAPI to separate Config.x users/parsers from Config.y details (#811)
Alex Rousskov [Sat, 8 May 2021 07:51:32 +0000 (07:51 +0000)] 
API to separate Config.x users/parsers from Config.y details (#811)

The new API avoids several kinds of unwanted code dependencies:

* Config.x users do not need to know the type of any Config.y component.
  Forward declarations of Config.y types are sufficient.

* Config.x parsers do not need to know about Config.y parsers. Config.x
  parsers can also be hidden from Config.x users.

* The centralized parsing code does not need to contain Config.x parsing
  code (for any x) and does not maintain "generic" parser registration.
  The compiler/linker do that for us _without_ losing C++ type safety.

Correct API implementation may also help separate the active Config
object from the being-parsed configuration, to eventually support safe
"hot" reconfiguration.

This change does not convert any existing Config fields and does not
imply a policy that existing fields must be converted when touched.

The API was tested on a typical new Config.x component (to be merged
separately). It is likely to evolve, especially when support for
multi-directive components is added.

Activated by using TYPE names with two colons (e.g., TYPE: Security::X).

4 years agoSource Format Enforcement (#763)
squidadm [Fri, 7 May 2021 23:30:55 +0000 (23:30 +0000)] 
Source Format Enforcement (#763)

4 years agoPrep for 4.15 and 5.0.6 (#798)
Amos Jeffries [Fri, 7 May 2021 10:11:37 +0000 (10:11 +0000)] 
Prep for 4.15 and 5.0.6 (#798)

Documentation only.

4 years agoFix GCC -Werror=range-loop-construct (#808)
Amos Jeffries [Thu, 6 May 2021 08:38:29 +0000 (08:38 +0000)] 
Fix GCC -Werror=range-loop-construct (#808)

This warning detects unnecessary object copying in C++ range loops, with
a focus on large objects and copies triggered by implicit type
conversions. Included in -Wall.

    error: loop variable ... creates a copy from type ...

4 years agoFixed typo in SPONSORS.list (#812)
new23d [Tue, 4 May 2021 06:26:24 +0000 (06:26 +0000)] 
Fixed typo in SPONSORS.list (#812)

Fixed spellings of Digital in DigitalOcean.

4 years agoReplace cbdata::Offset hack with offsetof() (#809)
Amos Jeffries [Tue, 4 May 2021 01:39:44 +0000 (01:39 +0000)] 
Replace cbdata::Offset hack with offsetof() (#809)

Also remove unused OFFSET_OF macro.

4 years agoStop processing a response if the Store entry is gone (#806)
Alex Rousskov [Mon, 3 May 2021 21:40:14 +0000 (21:40 +0000)] 
Stop processing a response if the Store entry is gone (#806)

HttpStateData::processReply() is usually called synchronously, after
checking the Store entry status, but there are other call chains.

StoreEntry::isAccepting() adds STORE_PENDING check to the ENTRY_ABORTED
check. An accepting entry is required for writing into Store. In theory,
an entry may stop accepting new writes (without being aborted) if
FwdState or another entry co-owner writes an error response due to a
timeout or some other problem that happens while we are waiting for an
I/O callback or some such.

N.B. HTTP and FTP code cannot use StoreEntry::isAccepting() directly
because their network readers may not be the ones writing into Store --
the content may go through the adaptation layer first and that layer
might complete the store entry before the entire peer response is
received. For example, imagine an adaptation service that wants to log
the whole response containing a virus but also replaces that (large)
response with a small error reply.

4 years agoBug 5106: Broken cache manager URL parsing (#788)
Amos Jeffries [Fri, 30 Apr 2021 05:15:44 +0000 (05:15 +0000)] 
Bug 5106: Broken cache manager URL parsing (#788)

Use already parsed request-target URL in cache manager and
update CacheManager to Tokanizer based URL parse

Removing use of sscan() and regex string processing which have
proven to be problematic on many levels. Most particularly with
regards to tolerance of normally harmless garbage syntax in URLs
received.

Support for generic URI schemes is added possibly resolving some
issues reported with ftp:// URL and manager access via ftp_port
sockets.

Truly generic support for /squid-internal-mgr/ path prefix is
added, fixing some user confusion about its use on cache_object:
scheme URLs.

TODO: support for single-name parameters and URL #fragments
are left to future updates. As is refactoring the QueryParams
data storage to avoid SBuf data copying.

4 years agoFix a few level-2+ debugs(); improve ErrorState debugging (#804)
Joshua Rogers [Sun, 18 Apr 2021 15:06:12 +0000 (15:06 +0000)] 
Fix a few level-2+ debugs(); improve ErrorState debugging (#804)

When possible, report object contents rather than its memory address.

4 years ago%ssl::<negotiated_version, %ssl::>negotiated_version for TLS/1.3 (#803)
Christos Tsantilas [Thu, 8 Apr 2021 17:32:32 +0000 (17:32 +0000)] 
%ssl::<negotiated_version, %ssl::>negotiated_version for TLS/1.3 (#803)

Both %codes were logged as dashes when Squid negotiated TLS v1.3.

This is a Measurement Factory project.

4 years agoFix various Clang-12.0 compiler warnings (#800)
Joshua Rogers [Tue, 6 Apr 2021 14:01:02 +0000 (14:01 +0000)] 
Fix various Clang-12.0 compiler warnings (#800)

Fixes -Wrange-loop-construct, -Wmismatched-tags, and -Wshadow.

4 years agoFix GCC 10.2.0 build on Ubuntu Hirsute s390x (#796)
Sergio Durigan Junior [Sun, 4 Apr 2021 20:16:47 +0000 (20:16 +0000)] 
Fix GCC 10.2.0 build on Ubuntu Hirsute s390x (#796)

GCC reports
 error: free-nonheap-object: snmp_core.cc(950): snmpCreateOidFromStr

4 years agoRemoved redundant Http::StatusLine::protocol (#794)
Alex Rousskov [Sat, 3 Apr 2021 03:04:42 +0000 (03:04 +0000)] 
Removed redundant Http::StatusLine::protocol (#794)

Also polished Http::StatusLine initialization, but that part needs a
lot more work to get rid of Http::StatusLine::init().

4 years agoHandle more partial responses (#791)
Alex Rousskov [Fri, 2 Apr 2021 07:46:20 +0000 (07:46 +0000)] 
Handle more partial responses (#791)

4 years agoHandle more Range requests (#790)
Alex Rousskov [Wed, 31 Mar 2021 02:44:42 +0000 (02:44 +0000)] 
Handle more Range requests (#790)

Also removed some effectively unused code.

4 years agoMaintenance: Start following Inclusive Naming Initiative advice (#786)
uhliarik [Sun, 28 Mar 2021 05:35:22 +0000 (05:35 +0000)] 
Maintenance: Start following Inclusive Naming Initiative advice (#786)

... as detailed at https://inclusivenaming.org/

This change is limited to the words "whitelist" and "blacklist". Those
two words are easier to replace with, arguably, better ones.

No functionality changes.

4 years agoBug 5112: Excessively loud chunked reply parsing error reporting (#789)
Alex Rousskov [Tue, 16 Mar 2021 17:51:05 +0000 (17:51 +0000)] 
Bug 5112: Excessively loud chunked reply parsing error reporting (#789)

Traffic parsing errors should be reported at level 2 (or below) because
Squid admins can usually do nothing about them and a noisy cache.log
hides important problems that they can and should do something about.

TODO: Detail this and similar parsing errors for %err_detail logging.

Also removed an unnecessary used-once macro.

4 years agoMerge pull request from GHSA-jjq6-mh2h-g39h
Alex Rousskov [Tue, 16 Mar 2021 15:45:11 +0000 (11:45 -0400)] 
Merge pull request from GHSA-jjq6-mh2h-g39h

4 years agoReplace defective Must2(c, "not c") API (#785)
Alex Rousskov [Tue, 16 Mar 2021 06:23:02 +0000 (06:23 +0000)] 
Replace defective Must2(c, "not c") API (#785)

... with Must3(c, "c", Here())

* We should not make a Must*() API different from the standard C++
  static_assert() API. It is just too confusing, especially since the
  two calls are very closely related.

* We should not tell Must*() writers to specify one condition (i.e. what
  must happen) but then describe the opposite condition (i.e. what went
  wrong). When the text describes the opposite condition, it is easy for
  a human writing or thinking about the text to type the wrong
  condition: Must2(got < need, "incomplete message") looks correct!

We should not keep the same macro name when changing the meaning of the
second parameter. Fortunately, adding a third argument to the macro fits
nicely into how modern Squid code should pass the source code location.

Must3() does not support SBuf descriptions. I tried to support them, but
doing so without duplicating non-trivial code is too difficult, and
since the current code does not actually use them, wasteful.

If future (complex) code needs SBuf conditions, then it should probably
use an explicit throw statement instead, especially since Must*() is,
like assert(), supposed to quickly check source code sanity rather than
validate unsafe input. A compile-time condition description and the
source code location is usually enough for sanity checks, while proper
reporting of invalid input usually also requires parsing context info.

4 years agoDelete a few unnecessary checks for standard C++ features (#779)
Alex Rousskov [Tue, 16 Mar 2021 01:09:34 +0000 (01:09 +0000)] 
Delete a few unnecessary checks for standard C++ features (#779)

* nullptr ought to be provided by any C++ compiler we support
* HAVE_NULLPTR_T was unused while std::nullptr_t is used w/o it
* HAVE_UNIQUE_PTR was almost unused while std::unique_ptr is used w/o it

4 years agoFix HttpHeaderStats definition to include hoErrorDetail (#787)
Alex Rousskov [Mon, 15 Mar 2021 14:05:05 +0000 (14:05 +0000)] 
Fix HttpHeaderStats definition to include hoErrorDetail (#787)

... when Squid is built --with-openssl.

We were "lucky" that the memory area after HttpHeaderStats was not,
apparently, used for anything important enough when HttpHeader::parse(),
indirectly called from errorInitialize() during initial Squid
configuration, was writing to it.

Detected by using AddressSanitizer.

The bug was created in commit 02259ff and cemented by commit 2673511.

4 years agoMaintenance: Make boilerplate copyright years update optional (#782)
Alex Rousskov [Thu, 4 Mar 2021 02:51:18 +0000 (02:51 +0000)] 
Maintenance: Make boilerplate copyright years update optional (#782)

Running with `--check-and-update-copyright no` allows developers to
format sources and/or perform other essential source maintenance actions
without changing the copyright year in 2000+ files.

No change to default ./scripts/source-maintenance.sh operation.

Also improved/updated scripts/source-maintenance.sh usage reporting and
added support for --help/-h options.

4 years agoMaintenance: Fix two misspellings (#784)
Alex Rousskov [Tue, 2 Mar 2021 22:06:33 +0000 (22:06 +0000)] 
Maintenance: Fix two misspellings (#784)

These typos were caught by scripts/spell-check.sh but then merged anyway
due to a `git diff` status code misinterpretation bug in the CI scripts.

4 years agoFixed a couple of minor typos (#783)
Ambrose Li [Sun, 28 Feb 2021 16:26:22 +0000 (16:26 +0000)] 
Fixed a couple of minor typos (#783)

4 years agoBug 5104: Memory leak in RFC 2169 response parsing (#778)
Amos Jeffries [Wed, 24 Feb 2021 00:53:21 +0000 (00:53 +0000)] 
Bug 5104: Memory leak in RFC 2169 response parsing (#778)

A temporary parsing buffer was not being released when
parsing completed.

4 years agoHandling missing issuer certificates for TLSv1.3 (#766)
Christos Tsantilas [Mon, 22 Feb 2021 21:15:32 +0000 (21:15 +0000)] 
Handling missing issuer certificates for TLSv1.3 (#766)

Prior to TLS v1.3 Squid could detect and fetch missing intermediate
server certificates by parsing TLS ServerHello. TLS v1.3 encrypts the
relevant part of the handshake, making such "prefetch" impossible.

Instead of looking for certificates in TLS ServerHello, Squid now waits
for the OpenSSL built-in certificate validation to fail with an
X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY error. Squid-supplied
verify_callback function tells OpenSSL to ignore that error. Squid
SSL_connect()-calling code detects that the error was ignored and, if
possible, fetches the missing certificates and orchestrates certificate
chain validation outside the SSL_connect() sequence. If that validation
is successful, Squid continues with SSL_connect(). See comments inside
Security::PeerConnector::negotiate() for low-level details.

In some cases, OpenSSL is able to complete SSL_connect() with an ignored
X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY error. If Squid validation
fails afterwards, the TLS connection is closed (before any payload is
exchanged). Ideally, the negotiation with an untrusted server should not
complete, but complexity BIO changes required to prevent such premature
completion is probably not worth reaching that ideal, especially since
all of this is just a workaround.

The long-term solution is adding SSL_ERROR_WANT_RETRY_VERIFY to OpenSSL,
giving an application a chance to download the missing certificates
during SSL_connect() negotiations. We assist OpenSSL team with that
change, but it will not be available at least until OpenSSL v3.0.

This description and changes are not specific to SslBump code paths.

This is a Measurement Factory project.

4 years agoBug 3556: "FD ... is not an open socket" for accept() problems (#777)
Alex Rousskov [Fri, 19 Feb 2021 16:14:37 +0000 (16:14 +0000)] 
Bug 3556: "FD ... is not an open socket" for accept() problems (#777)

Many things could go wrong after Squid successfully accept(2)ed a socket
and before that socket was registered with Comm. During that window, the
socket is stored in a refcounted Connection object. When that object was
auto-destroyed on the error handling path, its attempt to auto-close the
socket would trigger level-1 BUG 3556 errors because the socket was not
yet opened from Comm point of view. This change eliminates that "already
in Connection but not yet in Comm" window.

The fixed BUG 3556 errors stalled affected clients and leaked their FDs.

TODO: Keeping that window closed should not require a human effort, but
achieving that goal probably requires significant changes. We are
investigating.

4 years agoFix build on Fedora Rawhide (#772)
uhliarik [Thu, 18 Feb 2021 01:08:40 +0000 (01:08 +0000)] 
Fix build on Fedora Rawhide (#772)

* add SYSTEMD_LIBS to all binaries using client_side.cc, fixing linking
* add `<limits>` to all sources using std::numeric_limits, fixing gcc-11
  builds

4 years agoProtect SMP kids from unsolicited IPC answers (#771)
Eduard Bagdasaryan [Fri, 12 Feb 2021 13:33:16 +0000 (13:33 +0000)] 
Protect SMP kids from unsolicited IPC answers (#771)

When an SMP kid restarts, it recreates its IPC socket to flush any old
messages, but it might still receive IPC messages intended for its
previous OS process because the sender may write the message _after_
kid's IPC socket is flushed. Squid IPC communication is connectionless,
so the sender cannot easily detect the reopening of the recipient socket
to prevent this race condition. Some notifications are desirable across
kid restarts, so properly switching to connection-oriented IPC
communication would only complicate things further.

This change protects kids from, for the lack of a better term, an
"unsolicited" answer: An answer to a question the recipient did not ask.
When allowed to reach regular message-handling code, unsolicited answers
result in misleading diagnostics, may trigger assertions, and might even
result in a bad recipient state. For example, a kid might think it has
been successfully registered with Coordinator while its registration
attempt was actually dropped due to a Coordinator restart.

Our protection targets one specific use case: Responses that were born
(or became) "unsolicited" due to a recipient restart. Other problematic
cases may not require any protection, may require a very different
protection mechanism (e.g. cryptography), may deal with requests rather
than responses, or even cannot be reliably detected. For example:

* messages sent by a malicious attacker
* requests sent by a misconfigured Squid instance
* requests sent by a previous Squid instance
* messages sent by a no-longer-running kid process
* messages sent by buggy Squid code

----

Also marked a few out-of-scope problems/improvements, including a bug:

Improved handling of Coordinator and Strand exceptions exposed and
partially addressed an old problem: When configured to listen on an
inaccessible port, Squid used to kill the Coordinator job, resulting in
subsequent kid registration timeouts. Squid now correctly keeps the
Coordinator job running, logging a detailed report:

    WARNING: Ignoring problematic IPC message
        message type: 5
        problem: check failed: fd >= 0
        exception location: TypedMsgHdr.cc(198) putFd

Still, the affected kids do not report the port opening problem and
continue running, listening on the problem-free ports (if any).
Depending on the exception timing, similar behavior was possible before
these changes. The correct action here is to send the port opening error
to the kid process without throwing the putFd() exception, but we should
decide how Squid should handle such inaccessible configured ports first.

4 years agoDetail certificate validation errors during TLS handshake (#770)
Christos Tsantilas [Thu, 11 Feb 2021 22:31:00 +0000 (22:31 +0000)] 
Detail certificate validation errors during TLS handshake (#770)

Fix certificate validation error handling in Security::Connect/Accept().
The existing validation details were not propagated/copied to IoResult,
requiring the caller to extract them via ssl_ex_index_ssl_error_detail.
The clunky approach even required a special "ErrorDetail generations"
API to figure out which error detail is "primary": the one received in
IoResult or the just extracted one. That API is removed now.

This change is used by the upcoming improvements that fetch missing TLS
v1.3 server certificates, but it also has an immediate positive effect
on the existing reporting of the client certificate validation errors.
Currently, only a general TLS error is reported for those cases because
Security::Accept() code forgot to check ssl_ex_index_ssl_error_detail.

This is a Measurement Factory project.

4 years agoAllow 1xx and 204 responses with Transfer-Encoding headers (#769)
Alex Rousskov [Mon, 8 Feb 2021 22:49:42 +0000 (22:49 +0000)] 
Allow 1xx and 204 responses with Transfer-Encoding headers (#769)

HTTP servers MUST NOT send those header fields in those responses, but
some do, possibly because they compute the same basic headers for all
responses, regardless of the status code. Item 1 in RFC 7230 Section
3.3.3 is very clear about message framing in these cases. We have been
ignoring Content-Length under the same conditions since at least 2018.
We should be consistent and apply the same logic to Transfer-Encoding.

I also polished the Transfer-Encoding handling comment for clarity sake.

4 years agoPrep for 4.14 and 5.0.5 (#765)
Amos Jeffries [Tue, 2 Feb 2021 05:29:07 +0000 (05:29 +0000)] 
Prep for 4.14 and 5.0.5 (#765)

4 years agoDeduplicating IPC strand messages (#756)
Eduard Bagdasaryan [Fri, 22 Jan 2021 17:20:30 +0000 (17:20 +0000)] 
Deduplicating IPC strand messages (#756)

No functionality changes other than minor debugging improvements.

* replaced identical (except for the message kind value) HereIamMessage
  and StrandSearchResponse classes with StrandMessage
* reduced code duplication with a new StrandMessage::NotifyCoordinator()
* split TypedMsgHdr::type() into unchecked rawType() and checked type()
* renamed and documented several Ipc::MessageType enum values

The above code improvements will help with adding more IPC messages.

4 years agoProfiling: CPU timing implemented for MAC non-x86 (#757)
David CARLIER [Fri, 15 Jan 2021 15:41:47 +0000 (15:41 +0000)] 
Profiling: CPU timing implemented for MAC non-x86 (#757)

4 years agoDetail client closures of CONNECT tunnels during TLS handshake (#691)
Christos Tsantilas [Thu, 10 Dec 2020 20:12:45 +0000 (20:12 +0000)] 
Detail client closures of CONNECT tunnels during TLS handshake (#691)

... and improve detailing of other errors.

Many admins cannot triage TLS client failures, and even Squid developers
often cannot diagnose TLS problems without requiring detailed debugging
logs of failing transactions. The problem is especially bad for busy
proxies where debugging individual transactions is often impractical.

We enhance existing error detailing code so that more information is
logged via the existing %err_code/%err_detail logformat codes.
Propagating low-level error details required significant enhancements
and refactoring. We also built initial scaffolding for better error
detailing by GnuTLS-driven code and documented several key
error-handling APIs, exposing a few out-of-scope problems.

Also checkLogging() once, after consuming unparsed input attributed to a
transaction: Due to fake CONNECT requests, from-client read errors, and
possibly other complications, we may have a transaction that did not
consume every input byte available to it. That transaction is still
responsible for reporting those unparsed bytes (e.g., by logging the
number of bytes read on a connection and the number of parsed bytes).

Also fixed passing wrong (errno vs. size) or stale (requested vs. read)
I/O size to connFinishedWithConn(); now shouldCloseOnEof(). The bad
value was "correct" (i.e. zero) in many cases, obscuring the bug.

This is a Measurement Factory project

4 years agoBug 5057: "Generated response lacks status code" (#752)
Eduard Bagdasaryan [Wed, 18 Nov 2020 14:08:55 +0000 (14:08 +0000)] 
Bug 5057: "Generated response lacks status code" (#752)

... for responses carrying status-code with numerical value of 0.

Upon receiving a response with such a status-code (e.g., 0 or 000),
Squid reported a (misleading) level-1 BUG message and sent a 500
"Internal Error" response to the client.

This BUG message exposed a different/bigger problem: Squid parser
declared such a response valid, while other Squid code could easily
misinterpret its 0 status-code value as scNone which has very special
internal meaning.

A similar problem existed for received responses with status-codes that
HTTP WG considers semantically invalid (0xx, 6xx, and higher values).
Various range-based status-code checks could misinterpret such a
received status-code as being cachable, as indicating a control message,
or as having special for-internal-use values scInvalidHeader and
scHeaderTooLarge.

Unfortunately, HTTP/1 does not explicitly define how a response with a
status-code having an invalid response class (e.g., 000 or 600)
should be handled, but there may be an HTTP WG consensus that such
status-codes are semantically invalid:

https://lists.w3.org/Archives/Public/ietf-http-wg/2010AprJun/0354.html

Since leaking semantically invalid response status-codes into Squid code
is dangerous for response retries, routing, caching, etc. logic, we now
reject such responses at response parsing time.

Also fixed logging of the (last) received status-code (%<Hs) when we
cannot parse the response status-line or headers: We now store the
received status-code (if we can parse it) in peer_reply_status, even if
it is too short or has a wrong response class. Prior to this change,
%<Hs was either not logged at all or, during retries, recorded a stale
value from the previous successfully parsed response.

4 years agoRevert 017a2d1: Cleanup helper.h classes (#749)
Christos Tsantilas [Thu, 12 Nov 2020 17:28:06 +0000 (17:28 +0000)] 
Revert 017a2d1: Cleanup helper.h classes (#749)

Some members of HelperServerBase and child classes were initialized
incorrectly, killing various helpers.

4 years agoTransactions exceeding client_lifetime are logged as _ABORTED (#748)
Alex Rousskov [Tue, 10 Nov 2020 21:42:18 +0000 (21:42 +0000)] 
Transactions exceeding client_lifetime are logged as _ABORTED (#748)

... rather than timed out (_TIMEOUT).

To record the right cause of death, we have to call terminateAll()
rather than setting logType.err.timedout directly. Otherwise, when
ConnStateData::swanSong() calls terminateAll(0), it overwrites our
direct setting.

4 years agoSquid-to-client write_timeout triggers client_lifetime timeout (#747)
Alex Rousskov [Sun, 8 Nov 2020 17:50:03 +0000 (17:50 +0000)] 
Squid-to-client write_timeout triggers client_lifetime timeout (#747)

Since commit 5ef5e5c, a socket write timeout triggers two things:
* reporting of a write error to the socket writer (as designed/expected)
* reporting of a socket read timeout to the socket reader (unexpected).

The exact outcome probably depends on the transaction state, but one
known manifestation of this bug is the following level-1 message in
cache.log, combined with an access.log record showing a
much-shorter-than-client_lifetime transaction response time.

    WARNING: Closing client connection due to lifetime timeout

4 years agoSource Format Enforcement (#745)
squidadm [Fri, 6 Nov 2020 15:18:39 +0000 (15:18 +0000)] 
Source Format Enforcement (#745)

4 years agoOptimization: Avoid more SBuf::cow() reallocations (#744)
Alex Rousskov [Wed, 4 Nov 2020 14:27:22 +0000 (14:27 +0000)] 
Optimization: Avoid more SBuf::cow() reallocations (#744)

This optimization contains two parts:

1. A no-brainer part that allows SBuf to reuse MemBlob area previously
   used by other SBufs sharing the same MemBlob. To see this change,
   follow the "cowAvoided" code path modifications in SBuf::cow().

2. A part based on a rule of thumb: memmove is usually better than
   malloc+memcpy. This part of the optimization (follow the "cowShift"
   path) is only activated if somebody has consume()d from the buffer
   earlier. The implementation is based on the heuristic that most
   consuming callers follow the usual append-consume-append-... usage
   pattern and want to preserve their buffer capacity.

MemBlob::consume() API mimics SBuf::consume() and std::string::erase(),
ignoring excessive number of bytes rather than throwing an error.

Also detailed an old difference between an SBuf::cow() requiring just a
new buffer allocation and the one also requiring data copying.

Co-Authored-By: Christos Tsantilas <christos@chtsanti.net>
4 years agoTranslations: Update integration (#738)
Amos Jeffries [Wed, 28 Oct 2020 14:09:31 +0000 (14:09 +0000)] 
Translations: Update integration (#738)

* Add credits for es-mx translation moderator
* Use es-mx for default of all Spanish (Central America) texts
* Update translation related .am files

4 years agoDo not send keep-alive or close in HTTP Upgrade requests (#732)
Alex Rousskov [Tue, 27 Oct 2020 23:33:39 +0000 (23:33 +0000)] 
Do not send keep-alive or close in HTTP Upgrade requests (#732)

A presence of a Connection:keep-alive or Connection:close header in an
Upgrade request sent by Squid breaks some Google Voice services. FWIW,
these headers are not present in RFC 7230 Upgrade example, and popular
client requests do not send them.

* In most cases, Squid was sending Connection:keep-alive which is
  redundant in Upgrade requests (because they are HTTP/1.1).

* In rare cases (e.g., server_persistent_connections=off), Squid was
  sending Connection:close. Since we cannot send that header and remain
  compatible with popular Upgrade-dependent services, we now do not send
  it but treat the connection as non-persistent if the server does not
  upgrade and expects us to continue reusing the connection.

4 years agoAvoid null pointer dereferences when dynamic_cast'ing to SwapDir (#743)
Eduard Bagdasaryan [Tue, 27 Oct 2020 19:44:57 +0000 (19:44 +0000)] 
Avoid null pointer dereferences when dynamic_cast'ing to SwapDir (#743)

Detected by Coverity. CID 1461158: Null pointer dereferences
(FORWARD_NULL).

When fixing these problems, we moved a few cache_dir iterations into
Disks.cc by applying the "Only Store::Disks can iterate cache_dirs"
design principle to the changed code. The Disks class is responsible for
maintaining (and will eventually encapsulate all the knowledge of) the
set of cache_dirs. Adjusted cache_cf.cc no longer depends on Disk.h.

4 years agoFix std::ostream precision settings leak in Progress::print() (#739)
Alex Rousskov [Tue, 27 Oct 2020 16:11:59 +0000 (16:11 +0000)] 
Fix std::ostream precision settings leak in Progress::print() (#739)

No functionality changes expected.

Broken since inception (commit 8ecbe78d).

Detected by Coverity. CID 1468264: API usage errors(STREAM_FORMAT_STATE)

4 years agoFix cachemgr.cgi regression in the bug 4957 fix (#741)
Štěpán Brož [Tue, 27 Oct 2020 10:29:18 +0000 (10:29 +0000)] 
Fix cachemgr.cgi regression in the bug 4957 fix (#741)

After master commit 2e29287, authenticated CGI interface users could not
use the menu links (getting HTTP 403 error). Symptoms in cache.log:

    CacheManager: unknown@...: password needed for 'menu'
    CacheManager: <username>@...: incorrect password for 'menu'

4 years agoPreserve caller context across IPC-related timeout events (#742)
Eduard Bagdasaryan [Tue, 27 Oct 2020 06:16:59 +0000 (06:16 +0000)] 
Preserve caller context across IPC-related timeout events (#742)

Before this fix, the transaction context was not saved/restored when
scheduling the following three events:

* Ipc::Forwarder::RequestTimedOut()
* Ipc::UdsSender::DelayedRetry()
* Ipc::Inquirer::RequestTimedOut()

4 years agoRemoved StoreClient::created() and improved PURGE code quality (#734)
Eduard Bagdasaryan [Mon, 26 Oct 2020 16:21:34 +0000 (16:21 +0000)] 
Removed StoreClient::created() and improved PURGE code quality (#734)

The StoreClient::created() callback method was probably added in hope to
make Store lookups asynchronous, but that functionality has not been
implemented, leaving convoluted and dangerous synchronous created() call
chains behind. Moreover, properly supporting asynchronous Store lookups
in modern code is likely to require a very different API.

Removal of created() allowed to greatly simplify PURGE processing,
eliminating some tricky state, such as `purging` and `lookingforstore`.

Also removed all Store::getPublic*() methods as no longer used.

4 years agoBug 5073: Compile error: index was not declared in this scope (#740)
Amos Jeffries [Mon, 19 Oct 2020 01:25:50 +0000 (01:25 +0000)] 
Bug 5073: Compile error: index was not declared in this scope (#740)

Use strchr(3) instead of a legacy POSIX.1-2001 index(3) API.

Also removed the index() implementation on MS Windows as no longer used.

4 years agoTranslation: Add es-mx dialect translation (#728)
Javier Pacheco [Sat, 17 Oct 2020 10:51:26 +0000 (10:51 +0000)] 
Translation: Add es-mx dialect translation (#728)

es-mx.po translation file

4 years agoCleanup helper.h classes (#719)
Amos Jeffries [Sat, 17 Oct 2020 05:33:11 +0000 (05:33 +0000)] 
Cleanup helper.h classes (#719)

Polish up the classes in helper.h to use proper constructors as the
caller API for creation + initialization. Use C++11 initialization for
default values.

* no "virtual" in helper class destructor declaration could create
  memory leaks in future (poorly) refactored code; the gained protection
  is probably worth adding the (currently unused) virtual table to the
  helper class; resolves Coverity issue CID 1461141 (VIRTUAL_DTOR)
* missing Comm::Connection timers initialization on helper startup
* multiple initialization of values used for state accounting
* initialization of booleans to non-0 integer values
* initialization of char using numeric values
* missing mgr:filedescriptors description for helper sockets

4 years agoDo not duplicate free disk slots on diskers restart (#731)
Eduard Bagdasaryan [Fri, 9 Oct 2020 16:34:24 +0000 (16:34 +0000)] 
Do not duplicate free disk slots on diskers restart (#731)

When a disker process starts, it scans the on-disk storage to populate
shared-memory indexes of cached entries and unused/free slots. This
process may take more than ten minutes for large caches. Squid workers
use these indexes as they are being populated by diskers - workers do
not wait for the slow index rebuild process to finish. Cached entries
can be retrieved and misses can be cached almost immediately.

The disker does not "lock" the free slots to itself because the disker
does not want to preclude workers from caching new entries while the
disker is scanning the rock storage to build a complete index of old
cached entries (and free slots). The disker knows that it shares the
disk slot index with workers and is careful to populate the indexes
without confusing workers.

However, if the disker process is restarted for any reason (e.g., a
crash or kid registration timeout), the disker starts scanning its
on-disk storage from the beginning, adding to the indexes that already
contain some entries (added by the first disker incarnation and adjusted
by workers). An attempt to index the same cached object twice may remove
that object. Such a removal would be wasteful but not dangerous.
Indexing a free/unused slot twice can be disastrous:

* If Squid is lucky, the disker quickly hits an assertion (or a fatal
  exception) when trying to add the already free slot to the free slot
  collection, as long as no worker starts using the free slot between
  additions (detailed in the next bullet).

* Unfortunately, there is also a good chance that a worker starts using
  the free slot before the (restarted) disker adds it the second time.
  In this case, the "double free" event cannot be detected. Both free
  slot copies (pointing to the same disk location) will eventually be
  used by a worker to cache new objects. In the worst case, it may lead
  to completely wrong cached response content being served to an
  unsuspecting user. The risk is partially mitigated by the fact that
  disker crashes/restarts are rare.

Now, if a disker did not finish indexing before being restarted, it
resumes from the next db slot, thus avoiding indexing the same slot
twice. In other words, the disker forgets/ignores all the slots scanned
prior to the restart. Squid logs "Resuming indexing cache_dir..."
instead of the usual "Loading cache_dir..." to mark these (hopefully
rare) occurrences.

Also simplified code that delays post-indexing revalidation of cache
entries (i.e. store_dirs_rebuilding hacks). We touched that code because
the updated rock code will now refuse to reindex the already indexed
cache_dir. That decision relies on shared memory info and should not be
made where the old code was fiddling with store_dirs_rebuilding level.
After several attempts resulted in subtle bugs, we decided to simplify
that hack to reduce the risks of mismanaging store_dirs_rebuilding.

Adjusted old level-1 "Store rebuilding is ... complete" messages to
report more details (especially useful when rebuilding kid crashes). The
code now also reports some of the "unknown rebuild goal" UFS cases
better, but more work is needed in that area.

Also updated several rebuild-related counters to use int64_t instead of
int. Those changes stemmed from the need to add a new counter
(StoreRebuildData::validations), and we did not want to add an int
counter that will sooner or later overflow (especially when counting db
slots (across all cache_dirs) rather than just cache entries (from one
cache_dir)). That new counter interacted with several others, so we
had to update them as well. Long-term, all old StoreRebuildData counters
and the cache_dir code feeding them should be updated/revised.

4 years agoAlways send port in request-target of CONNECT requests to peers (#733)
Alex Rousskov [Thu, 1 Oct 2020 16:01:33 +0000 (16:01 +0000)] 
Always send port in request-target of CONNECT requests to peers (#733)

Broken since commit f5e1794 (Peering support for SslBump).

4 years agoBug 5076: WCCP Security Info incorrect (#725)
Craig Gowing [Wed, 30 Sep 2020 16:46:39 +0000 (16:46 +0000)] 
Bug 5076: WCCP Security Info incorrect (#725)

When generating and validating WCCP2 Security Info use only an
8 byte password.

4 years agoRemove always-true assert in ClpMap (#726)
Amos Jeffries [Thu, 17 Sep 2020 01:06:29 +0000 (01:06 +0000)] 
Remove always-true assert in ClpMap (#726)

Always-true assert()s are a build error for the latest GCC.

4 years agoBug 5065: url_rewrite_program documentation update (#692)
Patrick Scott Best [Tue, 15 Sep 2020 17:17:11 +0000 (17:17 +0000)] 
Bug 5065: url_rewrite_program documentation update (#692)

4 years agoCleanup: use C++11 initialization in ConnStateData (#721)
Amos Jeffries [Tue, 15 Sep 2020 12:11:33 +0000 (12:11 +0000)] 
Cleanup: use C++11 initialization in ConnStateData (#721)

Also, update some method documentation doxygen syntax.

Resolves Coverity Issue #1231353 - preserveClientData_ member
uninitialized by any constructor sequence.

4 years agoRestored support for non-lowercase Transfer-Encoding values (#723)
Alex Rousskov [Tue, 15 Sep 2020 04:07:43 +0000 (04:07 +0000)] 
Restored support for non-lowercase Transfer-Encoding values (#723)

... after "Improve Transfer-Encoding handling" commit f6dd87e.

Folks are reporting Chunked Transfer-Encoding values in real
traffic. HTTP requires case-insensitve treatment of codings.