Repository navigation
ADD: native FTP listing, fuzzing, budgets and soak; FIX: dialogs on screen, screen reader names, a multi-volume RAR crash - #93
Merged
CodingDiego merged 2 commits intoNov 14, 2026
Conversation
…hurn budgets, a one-hour soak FTP: the shell's FTP folder lists nothing from the loader's multi-threaded apartment, and the embedded Explorer view the tab fell back to showed a blank page without ever contacting the server. An ftp:// load now runs on a single-threaded apartment of its own, sorts there, releases its COM objects there (ShellFolder::park) and hands the UI thread only item IDs, which it binds again (rebind). A refused login or a silent server shows an error naming the place. scripts\ftp-check.ps1 proves listing, a subfolder, Up, a refused login, a copy out and password hygiene against scripts\ftp-server.py. Password redaction looks for the scheme anywhere in the text (after blanks, quotes or invisible characters, inside an error message, with one slash or two of either kind) and ends the password at the last @ of the authority, so an @ in a folder name can never change the host of an address that is shown, saved or opened again. The error text is redacted too. Fuzzing: the seven targets link and run on Windows MSVC with --sanitizer none (fuzz/src/lib.rs supplies the coverage section bounds and makes a panic leave its input); libfuzzer-sys is pinned. Performance: every dispatched message and accelerator is timed; a debug build logs each one over 50 ms with its message, window class and operation, and every build keeps the slowest in a window property. A message that ran a modal loop (a window move, a menu, a dialog, a drag) is left out. budgets.ps1 checks churn reloads and the slowest UI-thread message; CI passes -ChurnPerSec 1 -UiMs 1000. Soak: the release soak is one hour with a floor on the operation count, and the weekly workflow runs that hour.
…n readers, stop a multi-volume RAR crash Display and accessibility bugs found by the live tests of 2026-11-13, the fixes for the review of the previous commit, and one crash. Display (#24, #33): - Folder options, Connect and the archive password prompt stay inside the work area and scroll when their content is larger (new fit.rs). - The palette shows only the rows the screen has room for. - Small list icons follow the window's scale after it changes. - Tooltips follow the text size; a Home tile is never wider than its pane. - REXPLORER_TEXT_SCALE stands in for the Windows text size in tests; the smoke test has a fit check at 225 %. Accessibility (#21, #22, #23): - Folder options' check boxes and radio buttons are real buttons with a role and a state; its combo and edits have names. - Toolbar menu buttons report collapsed; the palette box has a name and recents read by name, not by ::{GUID}; preview caption lines have places. - A focused, unselected row shows an outline in every theme. - About names the contrast theme. Review of the FTP and tooling commit: - The test FTP server refuses every path outside its root, does not reuse its address and exits by itself after ten minutes; the check kills its whole process tree, and its refused-login step uses another user name (with the same user the shell may answer from the connection it holds). - redact finds the password by the authority's last @, in every address of a text, with IPv6 hosts and backslash passwords. - An error from the FTP worker carries only its code across threads. - A message that began a loop of its own is timed up to that loop. - The soak workflow fails when no fuzz target is listed. Crash: at each volume change of a multi-volume .rar, unrar-ng 0.7.7 copied 2048 characters from a string only as long as the next volume's name, and now and then that read left mapped memory (stack: archive::list > RARProcessFileW > MergeArchive > DllVolNotify > Internal::callback > U16CString::from_ptr_truncate). The crate is built from vendor/unrar-ng with that read fixed (it reads to the NUL). Whole core test binary: an access violation in 3 of 47 runs before, 0 of 60 after. Second review (of this commit): the redacted address ends its authority at ? and # as the shell does and reads each address once; the FTP check's cleanup cannot throw; parts of a wheel notch add up in the scrolled dialogs. Strings (#37): two archive errors come from the string table. Keys (#22): the README covers the tree, the palette and the dialogs.
CodingDiego
deleted the
FIX/windows-fit-icons-scale-and-accessibility
branch
November 14, 2026 00:13
This was referenced Nov 14, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two commits, kept apart by a rebase merge. Changes are under Unreleased in the changelog; the crate version stays 1.0.0-rc.2.
Commit 1: native FTP listing, fuzz targets, UI-thread timing, budgets, a one-hour soak
ftp://folder is listed by rexplorer itself. The shell's FTP folder only enumerates on a single-threaded apartment, so the listing runs on one, and everything it made there is released there before the list reaches the window (ShellFolder::parkandrebind). The embedded Explorer view the handoff recommended was tried first: the server log showed no connection at all.connect::redactkeeps the password out of titles, the address box, recents, the session file and error texts.scripts\budgets.ps1gains reload churn and slowest-UI-message budgets; CI runs them on every PR.scripts\ftp-check.ps1andscripts\ftp-server.py: twelve live checks against a local read-only FTP server.Commit 2: display and accessibility fixes, review fixes, one crash
fit.rs). The palette shows the rows the screen has room for. Small list icons follow the window's scale after it changes. Tooltips follow the text size..rarcould crash rexplorer now and then while it was listed or extracted. At each change of volumeunrar-ng0.7.7 copies 2048 characters from the pointer libunrar passes, which is astd::wstringonly as long as the next volume's name; when the read leaves mapped memory the process dies inmemcpy(stack from a traced test run:archive::list>RARProcessFileW>MergeArchive>DllVolNotify>Internal::callback>U16CString::from_ptr_truncate). 0.7.7 is the newest release, so the crate is built fromvendor/unrar-ngthrough[patch.crates-io]: the publishedsrc/with that one read changed to stop at the NUL (diff -ragainst the registry copy shows only that hunk;VENDORED.mdhas the details). The whole core test binary died with an access violation in 3 of 47 runs before and in 0 of 60 after. The fuzz workspace has the same patch.redactends the authority where the shell does (/,?,#), handles IPv6 hosts, backslash passwords and several addresses in one text; an error from the FTP worker carries only its code across threads; a message that began a loop of its own is timed up to that loop.How it was tested
On the final tree, on a quiet machine (Windows 11, toolchain 1.99.1):
cargo build --release --locked --all-targetswith-D warnings;cargo test --release --lockedthree times (app 278, core 257, data_ops 11, all green);cargo clippy --workspace --all-targets --locked -- -D warningsclean.scripts\smoke.ps1 -Hosted: 32 PASS, 8 SKIP, 0 FAIL, with the newfitcheck (Folder options did not fit at 225 % and its OK button was reached by scrolling; Connect and the palette fit).scripts\ftp-check.ps1: 12 of 12, six runs in a row.scripts\budgets.ps1with the CI values: start 334 ms, 100,000-file list 305 ms, idle CPU 0.0 %, churn 0.1 reloads/s, slowest UI-thread message 59 ms.memcpy(3 in 47 runs before).::{GUID}recent shown by its name).Not done
REXPLORER_TEXT_SCALE, and the scale change by a unit test of the icon scaling. A re-test under the real settings, with Narrator, and under a contrast theme (the new check boxes there) is still to run.fitcheck does not exercise scrolling; its line says which case ran./, or one inftp:user:pw@hostwithout slashes, is shown.DUI70.dllwhile the menu, tree and undo tests (the ones that show shell UI) ran. It is the only such event in this machine's log for 30 days and is not traced yet.lookandsidebar-shellfail now and then on a loaded machine (a sidebar row not there within 5 s). The master build fails the same way under the same load, and both pass 24 of 24 on a quiet machine.Issues
Related to #36, #49, #48, #84, #37, #22, #23 (each gets its verdict and is closed by hand after the merge), #57 and #29 (they wait for a green hosted "Fuzz and soak" run), #21, #24, #33 (a live re-test is left).