Skip to content

Migrate to OpenSSL - #2941

Merged
DL6ER merged 7 commits into
developmentfrom
new/openssl
Jul 26, 2026
Merged

Migrate to OpenSSL#2941
DL6ER merged 7 commits into
developmentfrom
new/openssl

Conversation

@DL6ER

@DL6ER DL6ER commented Jul 8, 2026

Copy link
Copy Markdown
Member

What does this implement/fix?

Migrate FTL's TLS stack from mbedTLS to OpenSSL (>= 3.0). First step toward DoQ/DoH3, which require QUIC.

Why

  • OpenSSL has first-class support in civetweb; its mbedTLS backend is the one behind the 100% CPU busy-spin on stalled TLS connections.
  • OpenSSL 3.5 (LTS) ships native QUIC (client and server) for the planned DoQ/DoH3 work. mbedTLS cannot do QUIC at all.

Webserver / X.509

  • CMake: link libssl/libcrypto instead of the three mbedTLS libraries; OPENSSL_API_3_0 for civetweb, HAVE_TLS for the FTL code (replacing USE_MBEDTLS/HAVE_MBEDTLS).
  • x509.c: RSA-4096 / EC P-384 keygen, X509_* certificate creation (SHA-256), self-signed CA and SANs, PEM/X509 reading and validation; --read-x509 prints the same output as the openssl CLI.
  • webserver.c: cipher-suite listing and the OpenSSL version via OpenSSL. Drop FTL_mbed_debug and the unused mod_mbedtls.inl.

Encrypted-upstream client (src/dotdoh)

Removing mbedTLS everywhere also means porting the DoT/DoH client; that port rebuilds it as a parallel forwarder, using the thread-safe SSL_CTX sharing and session resumption OpenSSL makes easy.

  • Fail-closed (SSL_VERIFY_PEER + host/IP verification); bare-IP upstreams verify against the certificate's iPAddress SANs.
  • An auto-scaled worker pool plus a per-upstream connection pool replace the single serial worker, so one slow upstream cannot stall the others and queries fan out across backends. TLS 1.3 resumption and an adaptive idle window keep connections warm; debug.dotdoh reports per-upstream stats.
  • Disable the HTTP/2-only Quad9 DoH presets (the client is HTTP/1.1).

nettle (DNSSEC, password hashing, TOTP) is unaffected. TLS stays optional and disabled when libssl/libcrypto are unavailable. Build side: pi-hole/docker-base-images#167 (static OpenSSL 3.5 in ftl-build, consumed here as v2.20).

How to test the change during review

  • Webserver TLS / cert: open the web UI over HTTPS; pihole-FTL --gen-x509 ... then pihole-FTL --read-x509 should match openssl x509 -text; pihole-FTL -vv reports the OpenSSL version and providers.
  • Encrypted upstreams: set dns.upstreams to a tls:// or https:// resolver (plus dns.upstreamCA if needed) and confirm dig @127.0.0.1 example.com resolves and the real upstream (not the internal 127.47.11.N) is shown in the query log.
  • Pool / keep-alive: set debug.dotdoh = true and watch the periodic per-upstream summary (throughput, connection reuse depth, resumed vs full handshakes).
  • Automated: test/dotdoh.bats covers DoT and DoH concurrency and keep-alive end to end; the full CI matrix builds and tests all seven arch/compiler targets.

Related issue or feature (if applicable): N/A

Pull request in docs with documentation (if applicable): pi-hole/docs#1400


By submitting this pull request, I confirm the following:

  1. I have read and understood the contributors guide, as well as this entire template. I understand which branch to base my commits and Pull Requests against.
  2. I have commented my proposed changes within the code.
  3. I am willing to help maintain this change if there are issues with it later.
  4. It is compatible with the EUPL 1.2 license
  5. I have squashed any insignificant commits. (git rebase)

Checklist:

  • The code change is tested and works locally.
  • I based my code and PRs against the repositories development branch.
  • I signed off all commits. Pi-hole enforces the DCO for all contributions
  • I signed all my commits. Pi-hole requires signatures to verify authorship
  • I have read the above and my PR is ready for review.

@DL6ER

DL6ER commented Jul 8, 2026

Copy link
Copy Markdown
Member Author

Failing CI is expected here for now.

FTL builds inside the ftl-build container, which currently ships mbedTLS but
not OpenSSL, so find_library(ssl/crypto) fails and the build cannot link.
Once the updated ftl-build image (with the static OpenSSL from
pi-hole/docker-base-images#167) is published, CI should go green. Keeping this
in draft until then.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Migrates FTL’s inbound HTTPS/TLS stack (civetweb + FTL X.509 tooling) from mbedTLS to OpenSSL (>= 3.0), aligning with civetweb’s OpenSSL backend and reworking certificate generation/inspection accordingly.

Changes:

  • Switch build flags and linking from mbedTLS to OpenSSL (HAVE_TLS, OPENSSL_API_3_0, link libssl/libcrypto).
  • Reimplement x509.c certificate/key generation and inspection using OpenSSL EVP/X509 APIs, and update CLI output.
  • Update Bats tests to compare OpenSSL-style --read-x509 output against recorded expectation files (whitespace-tolerant).

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
test/x509_read.expected Adds recorded expected --read-x509 output (OpenSSL-style).
test/x509_read_key.expected Adds recorded expected --read-x509-key output (includes private key dump).
test/test_suite.bats Updates X.509 tests to diff -w against expectation files.
src/webserver/x509.c Reimplements certificate generation, reading, domain matching, and validity checks using OpenSSL.
src/webserver/webserver.c Switches TLS-related functionality to OpenSSL (cipher listing, TLS feature gating).
src/webserver/civetweb/mod_mbedtls.inl Removes mbedTLS backend implementation file.
src/webserver/civetweb/civetweb.h Removes mbedTLS debug hook declarations.
src/dnsmasq_interface.c Renames TLS compile-time gating from HAVE_MBEDTLS to HAVE_TLS.
src/CMakeLists.txt Switches TLS detection/linking from mbedTLS libs to OpenSSL libs; renames option to USE_TLS.
src/args.c Updates CLI/version reporting and TLS gating to OpenSSL (HAVE_TLS).
patch/civetweb/0001-Add-mbedTLS-debug-logging-hook.patch Removes now-obsolete civetweb patch for mbedTLS debug hook.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/webserver/x509.c
Comment thread src/webserver/x509.c Outdated
Comment thread src/webserver/x509.c
Comment thread src/webserver/x509.c
@darkexplosiveqwx

Copy link
Copy Markdown
Contributor

I was about to get my branch ready, but yours looks much cleaner.

I do think looking at using APIs supported in both 3.5 and 4.0 is worth it.

I spun up a quick COPR to get build logs:

https://copr.fedorainfracloud.org/coprs/darkexplosiveqwx/pihole-dev/builds/ (ignore the first three, It's your branch starting at the 4th)

It found some compile issues:

https://download.copr.fedorainfracloud.org/results/darkexplosiveqwx/pihole-dev/fedora-44-x86_64/10699161-pihole-ftl-nightly/builder-live.log.gz for 3.5:

/builddir/build/BUILD/pihole-ftl-nightly-0.0.0.20260708-build/FTL-new-openssl/src/webserver/civetweb/civetweb.c:1802:10: fatal error: openssl/engine.h: No such file or directory
 1802 | #include <openssl/engine.h>
      |          ^~~~~~~~~~~~~~~~~~
compilation terminated.

civetweb still uses the old openSSL 1.1 header openssl/engine.h

You may tell your AI to take a look at the openSSL 4.0 compile log, maybe it can find some APIs that are supported in both 3.5 and 4.0: https://download.copr.fedorainfracloud.org/results/darkexplosiveqwx/pihole-dev/fedora-rawhide-x86_64/10699161-pihole-ftl-nightly/builder-live.log.gz

@DL6ER

DL6ER commented Jul 8, 2026

Copy link
Copy Markdown
Member Author

My local compile attempt inside the container with OpenSSL 3.5 (pi-hole/docker-base-images#167) went through fine on this branch

@darkexplosiveqwx

Copy link
Copy Markdown
Contributor

My local compile attempt inside the container with OpenSSL 3.5 (pi-hole/docker-base-images#167) went through fine on this branch

My COPR doesn't install the legacy openssl-devel-engine package. Simply removing the line #include <openssl/engine.h> works just fine. My first guess is that civetweb just placed the legacy engine header outside of OPENSSL_API_1_0/OPENSSL_API_1_1 zones.
Does ftl-build include the legacy engine?

@DL6ER

DL6ER commented Jul 8, 2026

Copy link
Copy Markdown
Member Author

No, the configure command line is

./Configure "${OSSL_TARGET}" \
        no-shared no-tests no-docs no-apps \
        no-legacy no-comp no-dtls no-ssl3 \
        no-psk no-srp no-idea no-rc2 no-rc4 no-rc5 no-md4 no-mdc2 no-whirlpool \
        no-engine no-dso \
        --prefix=/usr/local --libdir=lib --openssldir=/usr/local/ssl

with no-legacy

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 11 out of 11 changed files in this pull request and generated 3 comments.

Comment thread src/webserver/x509.c
Comment thread src/webserver/x509.c
Comment thread src/webserver/civetweb/civetweb.h
@darkexplosiveqwx

darkexplosiveqwx commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

No, the configure command line is

./Configure "${OSSL_TARGET}" \
        no-shared no-tests no-docs no-apps \
        no-legacy no-comp no-dtls no-ssl3 \
        no-psk no-srp no-idea no-rc2 no-rc4 no-rc5 no-md4 no-mdc2 no-whirlpool \
        no-engine no-dso \
        --prefix=/usr/local --libdir=lib --openssldir=/usr/local/ssl

with no-legacy

From what I found, engine is a separate no-engine.
I think we should build with no-engine and have the single-line patch for civetweb (ideally upstream).

Engine is discouraged since 3.0 and has been replaced with Providers.
It has also been completely removed in 4.0.

Edit:

oops I totally missed that it already includes no-engine, I'm startled where those engine headers came from then

Edit2:

The engine header files still seem to be shipped, even with no-engine.
Fedora RPM spec specifially excludes them:

%files devel
%doc CHANGES.md doc/dir-locals.example.el doc/openssl-c-indent.el
%{_prefix}/include/openssl
%exclude %{_prefix}/include/openssl/engine*.h
%{_libdir}/*.so
%{_mandir}/man3/*
%exclude %{_mandir}/man3/ENGINE*
%{_libdir}/pkgconfig/*.pc
%{_libdir}/cmake/OpenSSL/OpenSSLConfig.cmake
%{_libdir}/cmake/OpenSSL/OpenSSLConfigVersion.cmake


%if %{with engine}
%files devel-engine
%{_prefix}/include/openssl/engine*.h
%{_mandir}/man3/ENGINE*
%endif

We should still not depend on an outdated header, that just happens to be available.

Comment thread src/webserver/x509.c Fixed

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 3 comments.

Comment thread src/webserver/x509.c
Comment thread src/webserver/x509.c Outdated
Comment thread src/webserver/x509.c Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

Comment thread src/webserver/x509.c Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 12 changed files in this pull request and generated 1 comment.

Comment thread src/CMakeLists.txt Outdated
@Erasure5959

Copy link
Copy Markdown
Contributor

Perhaps another stupid question on my part - would the ECH support introduced in OpenSSL v4.0 have any relevance or benefit here?

@DL6ER

DL6ER commented Jul 9, 2026

Copy link
Copy Markdown
Member Author

would the ECH support introduced in OpenSSL v4.0 have any relevance or benefit here?

Yes, not in this migration but in the context of DoT/DoH (parallel PR #2940); when FTL forwards to an upstream encrypted resolver (Cloudflare, Quad9…), the ClientHello SNI leaks which resolver the Pi-hole uses to the ISP, even though the query contents are encrypted. Client-side ECH would close exactly that metadata leak - which aligns perfectly with the privacy point of encrypted DNS. Cloudflare already publishes ECH configs.

Does it really make a difference? Likely not. The DoH servers will be dedicated IP addresses serving one purpose so the metadata of the connection alone is likely equally sufficient for possible tracking purposes (thinking of "bad" countries and/or ISPs here). Anyway, the client would need to fetch the upstream's ECH config from a DNS HTTPS record (chicken-and-egg: you need DNS to bootstrap the ECH config) and wire OpenSSL's SSL_*ech* client APIs causing additional complexity. Meaningful work for a benefit that only hides the resolver identity from an on-path observer - a very niche threat for most home users I'd say. If you are at such risk in your country, you will be using a VPN tunnel anyway.

Signed-off-by: DL6ER <dl6er@dl6er.de>
@DL6ER
DL6ER marked this pull request as draft July 22, 2026 15:37
@DL6ER

DL6ER commented Jul 22, 2026

Copy link
Copy Markdown
Member Author

Switched this from OpenSSL 3.5 to OpenSSL 4.0. 4.0 ships SSL_get_peer_addr natively (the API the later DoQ server work needs), so we go straight to it rather than shipping 3.5 and migrating again shortly after. FTL's own code only needed three deprecated calls swapped for their non-deprecated equivalents (which still build on 3.0+), and the recorded --read-x509 output was re-recorded for 4.0's print format.

Depends on pi-hole/docker-base-images#173, which builds the ftl-build image with static OpenSSL 4.0 alongside nghttp2/ngtcp2/nghttp3. Marking as draft until that image is published and the ftl-build tag in .github/Dockerfile is bumped to it - CI here stays red on the current 3.5 image (v2.20) because the re-recorded X.509 expectation files match 4.0's formatting.

@github-actions

Copy link
Copy Markdown

This pull request has conflicts, please resolve those before we can evaluate the pull request.

@github-actions

Copy link
Copy Markdown

Conflicts have been resolved.

Comment thread src/webserver/x509.c Dismissed
@DL6ER
DL6ER force-pushed the new/openssl branch 3 times, most recently from 9bf5357 to 6ba1105 Compare July 23, 2026 11:29
Signed-off-by: DL6ER <dl6er@dl6er.de>
@DL6ER
DL6ER force-pushed the new/openssl branch 3 times, most recently from 975519b to 01ffa4c Compare July 24, 2026 18:41
@DL6ER
DL6ER marked this pull request as ready for review July 24, 2026 19:03
@DL6ER

DL6ER commented Jul 25, 2026

Copy link
Copy Markdown
Member Author

Green on all architectures now (amd64, 386, arm/v6, arm/v7, arm64 and riscv64), so this is really ready.

For the record, I also put the branch through an intense AI-assisted review - many adversarial passes over the fail-closed forwarding, the connection pool, TLS session resumption and the certificate handling. It came back sound bar one real bug (a slow upstream could stall a TLS handshake past its deadline), which is fixed here; everything else it flagged was cosmetic and would actually make the code much longer to handle edge cases, the current code is already correctly rejecting instead. Clients will retry and then it will work.

@DL6ER
DL6ER force-pushed the new/openssl branch 2 times, most recently from defd564 to 4bfcd6c Compare July 25, 2026 17:31
@darkexplosiveqwx

Copy link
Copy Markdown
Contributor

Even with OpenSSL 4.0 there still seems to be some legacy engine leftovers.
This is why civetweb still builds with openSSL 4, even tough my previous complaint about openssl/engine.h was not directly fixed.

Inside the new ftl-build $ podman run --rm -it --entrypoint /bin/sh ghcr.io/pi-hole/ftl-build:v2.23:

/ # ls -lan /usr/local/include/openssl/engine.h 
-rw-r--r--    1 0        0            50770 Jul 24 10:52 /usr/local/include/openssl/engine.h
/ # cat /usr/local/include/openssl/engine.h
/*
 * Copyright 2000-2022 The OpenSSL Project Authors. All Rights Reserved.
 * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#ifndef OPENSSL_ENGINE_H
#define OPENSSL_ENGINE_H
#pragma once

#include <openssl/macros.h>
#ifndef OPENSSL_NO_DEPRECATED_3_0
#define HEADER_ENGINE_H
#endif

#include <openssl/opensslconf.h>

/*
 * Engine support is gone. Definitions here are provided for the source code
 * compatibility only. They are meant to keep compilation working for legacy
 * projects that, for whatever reason, cannot remove/disable old legacy code.
 *
 * We deliberately keep the OPENSSL_NO_ENGINE macro around as it is supplied
 * when the build is configured with the `no-engine` option. OpenSSL 4.0 keeps
 * the `no-engine` option around.
 *
 * Note, we have to use a compile-time message to warn only if the API is really
 * used. To avoid complex macros, we kind of abuse the existing OSSL_DEPRECATED
 * macros.
 */

[...]

we can still compile with openSSL 4.0 since civetweb includes the header without using any functions from it, but I still think that it is very ugly nonetheless.

In pi-hole/docker-base-images#167 you mentioned:

Because the support for HTTP/2 is really crap inside CivetWeb (HTTP/3 nonexistent, even), I built a centralized TLS-terminator using OpenSSL for us to use. These are needed anyway and we can then stream the connections transparently to CivetWeb without it needing to comply with the removed deprecations.

This is especially interesting, how would this connect to civetweb doing TLS for h1.1, where it still uses the old openssl headers?

@rdwebdesign rdwebdesign left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DoT:
Image

DoH:
Image

@DL6ER
DL6ER merged commit 2994e1f into development Jul 26, 2026
18 checks passed
@yubiuser

Copy link
Copy Markdown
Member

I've upgrades my test Pi to the latest FTL and get some error in webserver.log when I try to access the webinterface via SSL which I think are tight to the Open SSL migration.

2026-07-27 11:14:19.005 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.475 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.537 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.538 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.539 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.541 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.545 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.545 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.554 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.559 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.566 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.567 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.567 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.568 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.568 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.578 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.581 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.587 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.587 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.591 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.593 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.595 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.606 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown
[2026-07-27 11:14:21.744 UTC 10027] sslize error: error:0A000416:SSL routines::tls alert certificate unknown

@rdwebdesign

Copy link
Copy Markdown
Member

I only see:

2026-07-27 14:49:54.513 sslize error: error:0A000418:SSL routines::tlsv1 alert unknown ca

which I think is normal, since it is a Self-Signed Certificate.

@yubiuser

Copy link
Copy Markdown
Member

2026-07-27 14:49:54.513 sslize error: error:0A000418:SSL routines::tlsv1 alert unknown ca

I get this as well.

which I think is normal, since it is a Self-Signed Certificate.

Mhh.. maybe it is, but can it be suppressed? Users will think, something is wrong.

@DL6ER

DL6ER commented Jul 27, 2026

Copy link
Copy Markdown
Member Author

You are right, this is a side effect of the mbedTLS -> OpenSSL switch, but harmless. certificate_unknown (0A000416) and unknown_ca (0A000418) are the same event from two different browsers: the client rejecting our self-signed certificate through a TLS alert during the handshake, the code just depends on the browser.

mbedTLS silently dropped these received alerts, whereas OpenSSL pushes them onto its error queue and CivetWeb logs the queue verbatim, i.e., once per connection attempt. So nothing actually fails, the user clicks through the browser warning and the connection proceeds as before, we just gained a log line we did not have with mbedTLS. It should be quieted down though, so we will demote these accept-side client alerts to a debug message rather than crying them into webserver.log - a rejected-but-recoverable handshake was never really an error on our side to begin with.

sawsanders pushed a commit to sawsanders/FTL that referenced this pull request Jul 28, 2026
Since the migration from mbedTLS to OpenSSL (pi-hole#2941), OpenSSL surfaces the
TLS alert a browser sends when it rejects our self-signed certificate
(`certificate_unknown` / `unknown_ca`) on its error queue. CivetWeb dumps
that queue verbatim through `mg_cry_internal`, so `webserver.log` now fills
with `sslize error: ...` lines on every fresh connection - something
mbedTLS silently swallowed before.

Such a handshake is recoverable, i.e., the user clicks through the warning
and the connection proceeds, so it is not really an error on our side. When
the failing `sslize` runs in a server context and the reason is a received
TLS alert (reason >= `SSL_AD_REASON_OFFSET`), log it via `DEBUG_TRACE`
instead, which only prints when `debug.webserver` is enabled. Genuine SSL
errors and the client path keep crying into the log as before.

The in-tree `civetweb.c` change is mirrored in
`patch/civetweb/0001-Demote-server-side-TLS-handshake-alerts-to-debug.patch`
so it survives the next CivetWeb update.

Signed-off-by: DL6ER <dl6er@dl6er.de>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

civetweb-master stuck at 100% CPU in busy poll loop, accept() never drains backlog

7 participants