Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
5606131
Implemented the worker/UI completion refactor
mzagozda Aug 9, 2026
89680aa
Implemented atomic file-operation cancellation
mzagozda Aug 9, 2026
0d92539
Implemented transactional overwrite handling
mzagozda Aug 9, 2026
a28dd19
Implemented the durable copy commit boundary
mzagozda Aug 9, 2026
9e4f271
Implemented cross-volume move protection
mzagozda Aug 9, 2026
a8362e0
Implemented recoverable journaling for native multi-item operations
mzagozda Aug 9, 2026
74eefb5
Implemented file-identity revalidation
mzagozda Aug 9, 2026
797b723
Implemented the legacy file-size/seek modernization
mzagozda Aug 9, 2026
655b980
Implemented the HTTPS crash-uploader change
mzagozda Aug 9, 2026
c8e3008
Implemented crash-upload hardening and updated the transmission docum…
mzagozda Aug 9, 2026
da9df4e
Implemented the SChannel migration for FTP/FTPS
mzagozda Aug 9, 2026
93df44e
Implemented DLL search-path hardening
mzagozda Aug 9, 2026
69258bd
Implemented the initial out-of-process parser boundary
mzagozda Aug 9, 2026
228471f
Implemented plug-in entry safety
mzagozda Aug 9, 2026
44c6d07
Implemented plug-in callback failure containment
mzagozda Aug 9, 2026
adde861
Implemented transactional automatic configuration persistence
mzagozda Aug 9, 2026
c045380
Implemented configuration schema hardening
mzagozda Aug 9, 2026
625ce45
Implemented configuration crash-recovery coverage
mzagozda Aug 9, 2026
ad307a2
Implemented the planning seam
mzagozda Aug 9, 2026
047cee6
Implemented the native file-operation characterization coverage
mzagozda Aug 9, 2026
c0e7a7c
Implemented crash-consistency fault-injection seams
mzagozda Aug 9, 2026
61ce029
Added NTFS/ReFS/FAT/SMB metadata contract and loss tracking in the na…
mzagozda Aug 9, 2026
a9d8c35
Added executable-level ADS scenarios
mzagozda Aug 9, 2026
f369098
Implemented ACL/ownership privilege handling
mzagozda Aug 9, 2026
7221046
Exercise junction, symlink, mount-point, and cloud-placeholder cases
mzagozda Aug 9, 2026
20e5a6d
Implemented dynamic wide-path handling
mzagozda Aug 9, 2026
78bb326
Implemented dynamic wide-path handling
mzagozda Aug 9, 2026
d5cdcf6
Replace fixed buffers at trust boundaries first
mzagozda Aug 9, 2026
b7b0b26
Implemented checked arithmetic across the active upload and parser IP…
mzagozda Aug 9, 2026
55b105a
Implemented explicit operation results for durable copy verification …
mzagozda Aug 9, 2026
383fe89
Added scoped_kernel_handle.h, a non-copyable RAII owner that preserve…
mzagozda Aug 9, 2026
b4e97fa
Adopt RAII for memory, mappings, and critical sections
mzagozda Aug 9, 2026
d3352c1
Standardize thread creation and ownership
mzagozda Aug 10, 2026
03648f8
Define bounded shutdown deadlines without unsafe escalation
mzagozda Aug 10, 2026
6d73197
Implemented monotonic 64-bit plug-in filesystem timers
mzagozda Aug 10, 2026
17eaf47
Implemented: replace `Sleep` polling with signaled waits
mzagozda Aug 10, 2026
d6bc597
Document and verify lock ordering
mzagozda Aug 10, 2026
46fa8c1
Reduce unowned global mutable state
mzagozda Aug 10, 2026
7641a49
Protect window and callback lifetimes
mzagozda Aug 10, 2026
d3b3689
Bound background work queues
mzagozda Aug 10, 2026
77c4ec3
Set resource budgets for directory enumeration
mzagozda Aug 10, 2026
1fc21ce
Reserve memory for graceful out-of-memory handling
mzagozda Aug 10, 2026
744516a
Remove modal UI and retry loops from the global allocation handler
mzagozda Aug 10, 2026
2916edb
Add a bounded release-build diagnostic ring buffer
mzagozda Aug 10, 2026
8a97cbb
Assign correlation IDs to operations and workers
mzagozda Aug 10, 2026
5d68c72
Preserve the first actionable error and its context
mzagozda Aug 10, 2026
01acf91
Preserve the first actionable error and its context
mzagozda Aug 10, 2026
53f2417
Apply deadlines and cancellation to all network operations
mzagozda Aug 10, 2026
854f89b
Make FTP transfers transactional and resumable safely
mzagozda Aug 10, 2026
bd049d7
Strengthen FTP certificate exception storage
mzagozda Aug 10, 2026
1cf76c2
Upgrade the bundled 7-Zip code
mzagozda Aug 10, 2026
8b60b34
Implemented new UI icons and bumped version number to 6
mzagozda Aug 10, 2026
5be116b
Upgrade SQLite and define database recovery behavior
mzagozda Aug 10, 2026
04f2fcd
Upgrade zlib
mzagozda Aug 10, 2026
aed3359
Upgrade cmark-gfm and harden rendered-content defaults
mzagozda Aug 10, 2026
2ffaf11
Upgrade bzip2
mzagozda Aug 10, 2026
1b840bb
Implemented the 7‑Zip task-dispatch hardening
mzagozda Aug 11, 2026
6f62228
Implemented the crash-compression hardening
mzagozda Aug 11, 2026
60b6edb
Implemented fluent design specification and assets
mzagozda Aug 11, 2026
66c38e6
Implemented the four plug-in reader migrations
mzagozda Aug 11, 2026
0c58195
Apply checked 64-bit file-size handling to active plug-in readers
mzagozda Aug 12, 2026
7039bfe
Updated readme.md
mzagozda Aug 14, 2026
0b9745c
Poweshell requirements added
mzagozda Aug 14, 2026
9c9b102
Improved testing process
mzagozda Aug 14, 2026
994cb6a
Initial version
mzagozda Aug 15, 2026
8991878
Improved testing framework and fixed memory leaks
mzagozda Aug 15, 2026
85173b9
Improved command buttons
mzagozda Aug 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 2 additions & 1 deletion .github/workflows/auto-label-author.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Label PRs from bellus869 and Lemi257
uses: actions/github-script@v7
# Pin the privileged pull_request_target action to a reviewed commit.
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7
with:
script: |
const labelName = "comments translation";
Expand Down
341 changes: 304 additions & 37 deletions .github/workflows/build-installer.yml

Large diffs are not rendered by default.

80 changes: 80 additions & 0 deletions .github/workflows/nightly-lock-stress.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
name: Nightly Lock Stress

on:
schedule:
- cron: '17 2 * * *'
workflow_dispatch:

permissions:
contents: read

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
BUILD_CONFIGURATION: Debug
SOLUTION_PATH: 'src\\vcxproj\\salamand.sln'
PLATFORM_TOOLSET: v145
OPENSAL_BUILD_DIR: '${{ github.workspace }}\\build_stage\\'

jobs:
verifier-lock-stress:
# FlaUI needs an unlocked desktop and an isolated profile; this label is deliberately not a hosted runner.
runs-on: [self-hosted, windows, filemanager-ui]

steps:
- name: Checkout
# Pin actions by reviewed commit to keep the nightly diagnostic lane reproducible.
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

- name: Setup MSBuild
uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce # v2

- name: Setup MSVC Developer Command Prompt (x64 toolchain)
uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1
with:
arch: x64

- name: Build Debug x64 executable
shell: pwsh
run: |
msbuild $env:SOLUTION_PATH /m /t:Build /p:Configuration=$env:BUILD_CONFIGURATION /p:Platform=x64 /p:PlatformToolset=$env:PLATFORM_TOOLSET /p:PreferredToolArchitecture=x64 /nr:false

- name: Run Application Verifier and PageHeap UI suite
shell: pwsh
run: |
$appVerifier = Get-Command appverif.exe -ErrorAction SilentlyContinue
if ($null -eq $appVerifier) {
$appVerifier = Get-ChildItem 'C:\Program Files (x86)\Windows Kits\10\Debuggers' -Filter appverif.exe -Recurse -ErrorAction SilentlyContinue |
Select-Object -First 1
}
if ($null -eq $appVerifier) {
throw 'Application Verifier is required on the filemanager-ui runner.'
}
$appVerifierPath = if ($appVerifier -is [System.Management.Automation.CommandInfo]) {
$appVerifier.Source
} else {
$appVerifier.FullName
}

$executable = Get-ChildItem $env:OPENSAL_BUILD_DIR -Filter salamand.exe -Recurse |
Where-Object { $_.FullName -like '*Debug_x64*' } |
Select-Object -First 1
if ($null -eq $executable) {
throw 'The Debug x64 salamand.exe build output was not found.'
}

# The self-hosted runner account is dedicated to this lane, which makes profile-mutating UI tests safe.
$env:FILEMANAGER_UI_ISOLATED = '1'
$env:FILEMANAGER_UI_EXE = $executable.FullName
# Nightly has the time budget for the longer lifecycle resource-growth sample.
$env:FILEMANAGER_UI_LEAK_CYCLES = '100'
.\tools\run-lock-verifier-stress.ps1 -ExecutablePath $executable.FullName `
-TestProject '.\tests\FileManager.UiTests\FileManager.UiTests.csproj' -AppVerifierPath $appVerifierPath `
-LogOutputDirectory '.\application-verifier-logs' -VerifierProfile Full -TestFilter 'TestCategory=UI'

- name: Upload Application Verifier logs
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: application-verifier-pageheap-logs
path: application-verifier-logs
if-no-files-found: warn
35 changes: 35 additions & 0 deletions .github/workflows/nightly-parser-fuzz.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: Nightly Parser Corpus Soak

on:
schedule:
- cron: '43 3 * * *'
workflow_dispatch:

permissions:
contents: read

env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

jobs:
deterministic-parser-soak:
runs-on: windows-2025

steps:
- name: Checkout
# Pin the scheduled campaign to a reviewed action commit as well as a reviewed source revision.
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

- name: Setup MSVC Developer Command Prompt (x64 toolchain)
uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1
with:
arch: x64

- name: Replay bzip2 hostile-input corpus
shell: pwsh
# Repetition raises the scheduled parser-execution budget without making PR checks slow.
run: .\tools\test-bzip2-compatibility.ps1 -Architecture x64 -Iterations 250

- name: Replay Markdown extension-combination corpus
shell: pwsh
run: .\tools\test-cmark-gfm-hardening.ps1 -Iterations 250
4 changes: 2 additions & 2 deletions .github/workflows/pr-comments-guard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ jobs:

- name: Checkout PR
if: steps.label_check.outputs.should-skip != 'true'
uses: actions/checkout@v4
# Pin checkout because this pull_request_target job reads untrusted PR content.
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
Expand Down Expand Up @@ -206,7 +207,6 @@ jobs:
'src/plugins/automation/generated',
'src/plugins/shared/lukas',
'src/plugins/ftp',
'src/plugins/ftp/openssl',
'src/plugins/ieviewer/cmark-gfm/build/src',
'src/plugins/ieviewer/cmark-gfm/build/extensions',
'src/plugins/ieviewer/cmark-gfm/extensions',
Expand Down
59 changes: 54 additions & 5 deletions .github/workflows/pr-msbuild.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,16 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v4
# Pin actions by reviewed commit to keep PR execution independent of moved tags.
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
path: s

- name: Setup MSBuild in PATH (VS2022)
uses: microsoft/setup-msbuild@v2
uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce # v2

- name: Setup MSVC Developer Command Prompt (x64 toolchain)
uses: ilammy/msvc-dev-cmd@v1
uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1
with:
arch: x64

Expand All @@ -66,8 +67,51 @@ jobs:
git fetch --no-tags --depth=1 origin ${{ github.event.pull_request.base.ref }}
.\tools\verify-no-new-terminatethread.ps1 -BaseCommit origin/${{ github.event.pull_request.base.ref }}

- name: Reject new raw thread creation
if: github.event_name == 'pull_request'
run: |
git fetch --no-tags --depth=1 origin ${{ github.event.pull_request.base.ref }}
.\tools\verify-no-new-raw-thread-creation.ps1 -BaseCommit origin/${{ github.event.pull_request.base.ref }}

- name: Reject new wrap-prone tick-count timing
if: github.event_name == 'pull_request'
run: |
git fetch --no-tags --depth=1 origin ${{ github.event.pull_request.base.ref }}
.\tools\verify-no-new-gettickcount.ps1 -BaseCommit origin/${{ github.event.pull_request.base.ref }}

- name: Reject new fixed MAX_PATH buffers
if: github.event_name == 'pull_request'
run: |
git fetch --no-tags --depth=1 origin ${{ github.event.pull_request.base.ref }}
.\tools\verify-no-new-max-path-buffers.ps1 -BaseCommit origin/${{ github.event.pull_request.base.ref }}

- name: Reject new unchecked string-copy and formatting calls
if: github.event_name == 'pull_request'
run: |
git fetch --no-tags --depth=1 origin ${{ github.event.pull_request.base.ref }}
.\tools\verify-no-new-unsafe-string-calls.ps1 -BaseCommit origin/${{ github.event.pull_request.base.ref }}

- name: Verify asynchronous operation completion protocol
run: .\tools\verify-operation-completion-protocol.ps1

- name: Verify durable copy commit protocol
run: .\tools\verify-durable-copy-commit.ps1

- name: Exercise zlib compatibility and corrupt-input vectors
if: matrix.platform == 'x64'
run: .\tools\test-zlib-compatibility.ps1

- name: Exercise bzip2 golden archives, truncation, and fuzz corpus
if: matrix.platform == 'x64'
run: .\tools\test-bzip2-compatibility.ps1

- name: Exercise cmark-gfm snapshots, limits, and extension fuzz combinations
if: matrix.platform == 'x64'
run: .\tools\test-cmark-gfm-hardening.ps1

- name: Register MSVC problem matcher
uses: ammaraskar/msvc-problem-matcher@master
# This reviewed commit replaces the mutable master branch in PR builds.
uses: ammaraskar/msvc-problem-matcher@541aa4360062d76d9620af6b8bd35cfa0c5ef19f

- name: Build via MSBuild (Debug | ${{ matrix.platform }})
run: |
Expand Down Expand Up @@ -99,9 +143,14 @@ jobs:
exit $LASTEXITCODE
}

- name: Exercise SQLite WAL recovery and corrupt-page detection
# The native DLL must be built first; this x64 probe owns only a GUID-named temporary database.
if: matrix.platform == 'x64'
run: .\tools\test-sqlite-recovery.ps1 -SqliteDll .\src\vcxproj\sqlite\salamander\Debug_x64\utils\sqlite.dll

- name: Upload build logs
if: always()
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: msbuild-${{ matrix.platform }}-debug-logs
path: |
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/pr-squash-guard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check commit count and fail if necessary
uses: actions/github-script@v7
# Pin the action so the policy guard cannot inherit a moved release tag.
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7
with:
script: |
const targetAuthors = ["Lemi257", "bellus869"];
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,7 @@ nul
*.backup
.claude
.vscode
.dotnet-cli
.nuget-packages
tests/FileManager.UiTests/obj
*.trx
Loading
Loading