mirror of
https://github.com/xroche/httrack.git
synced 2026-07-28 19:43:02 +03:00
* PT_GetTime copied gmtime's shared static instead of a reentrant breakdown On _WIN32 the success path took gmtime()'s pointer and dereferenced it after the fact, so a concurrent conversion on another thread could change the breakdown under it. The POSIX branch was already reentrant via gmtime_r, and the same #ifdef pair had been copy-pasted into hts_now_iso8601() and the WARC auto-name; fold all of them onto one hts_gmtime() helper, and give ProxyTrack's WebDAV listing the same treatment, since it read the static's fields well past the call. Windows uses Microsoft's gmtime_s (destination first, errno_t return), not the C11 Annex K function of the same name. Covered by a new "gmtime" engine self-test: a reference table checks the breakdown itself, which is what catches a swapped-argument call on the MSVC leg, and eight threads hammering the helper catch a return to the shared static (16k of 400k conversions corrupt with that mutant in place). Closes #794 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Xavier Roche <roche@httrack.com> * Give the gmtime self-test teeth on the failure path and off UTC Three holes the test-design audit found by running mutants rather than reading the diff. A helper that discarded gmtime_r's NULL and always claimed success passed every phase, yet that boolean is the only failure signal hts_now_iso8601, warc_open and PT_GetTime have; all three would have formatted an uninitialised struct tm. A forced-failure row now converts INT64_MAX, gated on a 64-bit time_t. The localtime_r mutant only died on a non-UTC box. CI runners are UTC, where localtime_r and gmtime_r agree on every reference row, so the test exports TZ=XXX5. The "first result survives the second call" phase could not fail: both buffers are caller-owned stack storage no implementation writing through tmbuf could disturb. Removed rather than left reading as coverage. expect_ok() was a third byte-identical copy; it moves to tests/testlib.sh with the two existing callers. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Xavier Roche <roche@httrack.com> * Rename the self-test's out-of-range time_t off the "far" keyword WinDef.h defines "far" away to nothing, so the declaration lost its variable and MSVC rejected the file. Both Windows legs caught it; the POSIX builds never see the macro. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Xavier Roche <roche@httrack.com> --------- Signed-off-by: Xavier Roche <roche@httrack.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
19 lines
603 B
Bash
19 lines
603 B
Bash
#!/bin/bash
|
|
#
|
|
|
|
set -euo pipefail
|
|
|
|
testdir=$(cd "$(dirname "$0")" && pwd)
|
|
# shellcheck source=tests/testlib.sh
|
|
. "${testdir}/testlib.sh"
|
|
|
|
tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/httrack_changes_st.XXXXXX") || exit 1
|
|
trap 'set +e; rm -rf "$tmpdir"' EXIT
|
|
trap 'rm -rf "$tmpdir"' HUP INT QUIT PIPE TERM
|
|
|
|
# --changes bucket accounting and JSON escaping (#714).
|
|
expect_ok "changes self-test" httrack -O "${tmpdir}/o1" -#test=changes run
|
|
# The report must hold against a transfer thread the crawl never joins.
|
|
expect_ok "changes-race self-test" httrack -O "${tmpdir}/o2" \
|
|
-#test=changes-race "${tmpdir}/race"
|