Skip to content

Commit db7cefe

Browse files
committed
FEATURE-ci-v3-runtime-green: open interop keylog with Windows-compatible flags
1 parent b080f74 commit db7cefe

3 files changed

Lines changed: 18 additions & 0 deletions

File tree

‎ChangeLog‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
Version 3.0.0 - 2026-10-10
2+
Open the QUIC interop test keylog with Windows-compatible flags
3+
instead of O_NOFOLLOW/O_CLOEXEC/fchmod.
24
Complete the first FreeBSD native make-check exposure: portable
35
process-memory measurement, GNU-make gate selection, the
46
loopback admin alias, per-test hang bounds and job budget.

‎specs/tasks/FEATURE-ci-v3-runtime-green.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,3 +173,9 @@ Full local `make check -j1` (TLS=no, g++ 15.2, WSL2): 232/235 pass, 2 platform s
173173
- [x] Local gates: fresh worktree configure/build; `native_protocol_memory` passes under the new LOG_COMPILER wrapper; `test-v3-ci-workflows.py` 31/31, `test-v3-platform-ci.py` 20/20, `test-v3-http3-full-gates.py` 1/1; changed-file cpplint and YAML parse pass.
174174
- [ ] Open flakes (no repair without a recurrence, per the standing http2-stale precedent): `response_sources` test 24 hang (one occurrence; the claim/close guard is a single atomic CAS and `pull_handle`'s fread cannot block on a pipe whose write end is closed — mechanism unexplained) and `response_definition` checks 846/847 (coroutine did not complete after the mid-send truncation). Both pass on Linux/macOS; the next FreeBSD run with bounded hangs decides.
175175
- [ ] Full FreeBSD acceptance CI evidence.
176+
177+
## Stage 12: Windows TLS-on interop keylog portability (2026-10-30)
178+
179+
- [x] Evidence (mingw64 job 124232738670, Windows acceptance job 124233097485, both at b080f744): with stage 10 in place the mingw64 package lane printed `PASS installed consumer native TLS=no` — the entire installed tls-no matrix including public-tls and public-http2 passed on Windows for the first time. The tls-yes lane then failed building `libquic_interop_provider_a`: `src/detail/tls_session.cpp:127/129` use `O_NOFOLLOW`, `O_CLOEXEC` and `fchmod`, none of which exist on Windows.
180+
- [x] Repair: `open_keylog()` gains a `_WIN32` branch using `_O_NOINHERIT` (the close-on-exec analog) and dropping `fchmod` (the creating open already owns the file); the POSIX branch is unchanged. This is the only site in `src/` using those identifiers (`quic_tls_session.cpp` is clean). POSIX-branch syntax check with the interop define passes locally; cpplint clean.
181+
- [ ] Full Windows tls-yes CI evidence past the interop provider build (SNI/rotation scenarios and the tls-yes public audits remain first-exposure).

‎src/detail/tls_session.cpp‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,21 @@ struct tls_session::impl {
124124
void open_keylog() {
125125
const char* path = std::getenv("SSLKEYLOGFILE");
126126
if (!quic || !interop_mode() || !path || !*path) return;
127+
#if defined(_WIN32)
128+
// Windows has no O_NOFOLLOW/O_CLOEXEC/fchmod; _O_NOINHERIT is the
129+
// close-on-exec analog and the creating open already owns the file.
130+
keylog_fd = ::open(path, O_WRONLY | O_CREAT | O_APPEND | _O_NOINHERIT, 0600);
131+
struct stat info{};
132+
if (keylog_fd < 0 || fstat(keylog_fd, &info) != 0 || !S_ISREG(info.st_mode)) {
133+
throw std::runtime_error("test keylog unavailable");
134+
}
135+
#else
127136
keylog_fd = ::open(path, O_WRONLY | O_CREAT | O_APPEND | O_NOFOLLOW | O_CLOEXEC, 0600);
128137
struct stat info{};
129138
if (keylog_fd < 0 || fstat(keylog_fd, &info) != 0 || !S_ISREG(info.st_mode) || fchmod(keylog_fd, 0600) != 0) {
130139
throw std::runtime_error("test keylog unavailable");
131140
}
141+
#endif
132142
}
133143
static void keylog(const SSL* ssl, const char* line) noexcept {
134144
auto* self = state(const_cast<SSL*>(ssl));

0 commit comments

Comments
 (0)