Skip to content

[flutter_tools] Reland "Extract Windows archives using native tar" - #193515

Open
bkonyi wants to merge 6 commits into
flutter:masterfrom
bkonyi:reland-windows-archive-extraction
Open

bkonyi wants to merge 6 commits into
flutter:masterfrom
bkonyi:reland-windows-archive-extraction

Conversation

@bkonyi

@bkonyi bkonyi commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

Relands #192298 (reverted in #193161 due to #193156).

Fix for #193156

In #192298, _WindowsUtils.unzip and _WindowsUtils.unpack checked _processManager.canRun('tar') and invoked bare tar. On Windows environments where Git for Windows (usr\bin) or MSYS2 is placed ahead of C:\Windows\System32 on PATH (such as flutter/packages and flutter/devtools CI bots running under Git Bash), bare tar resolved to MSYS2 GNU tar (/usr/bin/tar) instead of Windows' built-in bsdtar (C:\Windows\System32\tar.exe). GNU tar interprets Windows drive letters (C:\...) as remote hostnames (Cannot connect to C: resolve failed) and does not support .zip archives.

This reland resolves Windows' built-in bsdtar explicitly via %SYSTEMROOT%\System32\tar.exe (falling back to %WINDIR% and C:\Windows) so GNU tar on PATH is never invoked.

Validation (led against flutter/packages Windows Roll Builders)

Verified manually via led by overriding the flutter/flutter checkout to refs/pull/193515/head on the previously failing flutter/packages Windows builders:

  • Windows_x64 windows-build_all_packages master (8669301311576632273): PASSED (extracted all four Windows SDK .zip archives inside bash.exe and built the all_packages Windows debug and release apps).
  • Windows_x64 custom_package_tests master - packages (8669300947865231921): PASSED (tested against roll PR flutter/packages#12973, exercising packages/pigeon windows_unittests, extracting the Windows SDK and building test_plugin_example.exe).

Summary of Changes

  • Replaces in-memory package:archive (ZipDecoder and TarDecoder) decoding in _WindowsUtils.unzip and _WindowsUtils.unpack with native %SYSTEMROOT%\System32\tar.exe -xf <file> -C <target>, streaming directly on disk to prevent out-of-memory crashes on large archives (#133371) and removing package:archive from os.dart and windows/application_package.dart (#115660, where package:archive 4.x pulls in package:posix FFI).
  • Requires System32\tar.exe (bsdtar, included since Windows 10 version 1803 / build 17063) for both unzip and unpack without a PowerShell Expand-Archive fallback (inbox Windows PowerShell 5.1 Microsoft.PowerShell.Archive 1.0.1.0 lacks zip-slip path-traversal validation).
  • Preserves zip-slip protection (#185794): bsdtar strips leading slashes/drive letters and rejects archive entries containing .. components unless -P (--absolute-paths) is passed.
  • Catches ProcessException in WindowsApp.fromPrebuiltApp (allowing ToolExit to propagate) to log 'Invalid prebuilt Windows app. Unable to extract from archive.'.
  • Adds unit tests in os_test.dart and application_package_test.dart plus cross-platform real extraction and zip-slip tests in os_utils_test.dart.

Fixes #193156
Fixes #133371
Part of #115660

Pre-launch Checklist

…h PowerShell fallback"

Relands flutter#192298 (reverted in flutter#193161 due to flutter#193156).

Resolve Windows System32 tar.exe explicitly via SystemRoot/windir environment variables instead of relying on bare tar on PATH, preventing GNU tar from Git for Windows or MSYS2 from being invoked.
@bkonyi
bkonyi requested a review from a team as a code owner September 29, 2026 18:02
@flutter-dashboard flutter-dashboard Bot added the CICD Run CI/CD label Sep 29, 2026
@github-actions github-actions Bot added tool Affects the "flutter" command-line tool. See also t: labels. platform-windows Building on or for Windows specifically a: desktop Running on desktop team-windows Owned by the Windows platform team labels Sep 29, 2026

@gemini-code-assist gemini-code-assist Bot 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.

Code Review

This pull request replaces the Dart-based archive package with native Windows utilities (tar.exe or PowerShell) for unzipping and unpacking archives on Windows, updating the corresponding error handling and tests. The review feedback highlights a potential resource leak where the temporary directory created during prebuilt Windows app extraction is not cleaned up if the extraction process fails with an exception or a ToolExit.

@mattkae mattkae 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.

Testing + commenting feedback!

Explain why `_WindowsUtils._tarPath` prefers `SYSTEMROOT` over `WINDIR` before falling back to `C:\Windows`, drop duplicate mixed-case environment lookups since `Platform.environment` is case-insensitive on Windows, and test all three resolution paths in `os_test.dart`.
Remove the PowerShell `Expand-Archive` fallback from `_WindowsUtils.unzip` so both `unzip` and `unpack` extract archives via `%SYSTEMROOT%\System32\tar.exe` (`bsdtar`, included since Windows 10 version 1803), avoiding inbox Windows PowerShell 5.1 `Expand-Archive` path-traversal gaps.

Extract `tarResolutionCases` in `os_test.dart`, add explicit tests verifying `-P` and `--absolute-paths` are never passed to `tar.exe`, drop the redundant `FileSystemException` catch in `WindowsApp.fromPrebuiltApp`, and add cross-platform `OperatingSystemUtils` archive extraction and zip-slip tests in `os_utils_test.dart`.
@bkonyi bkonyi changed the title [flutter_tools] Reland "Extract Windows archives using native tar with PowerShell fallback" [flutter_tools] Reland "Extract Windows archives using native tar" Nov 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

a: desktop Running on desktop CICD Run CI/CD platform-windows Building on or for Windows specifically team-windows Owned by the Windows platform team tool Affects the "flutter" command-line tool. See also t: labels.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Flutter into Packages roller is failing [flutter_tools] Optimize archive extraction on Windows

3 participants