[release/7.0] Fix TarWriter.TarEntry exception when adding file whose Unix group owner does not exist in the system #81139
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.
Backport of #81070 to release/7.0
/cc @carlossanlop
Customer Impact
Customers are reporting the issue dotnet/sdk-container-builds#246 in which the
dotnet publish
command is failing on MacOS on ARM when attempting to create an image test-container.The failure is coming from our new
System.Formats.Tar
APIs. The container creation code callsTarWriter.WriteEntry(string filePath, string entryName)
, which is an API that reads the file from disk and inserts it to the TAR archive, making sure all its filesystem metadata is also included.In Unix platforms, we try to retrieve the name of the group that owns the file, by using the group ID that is stored in the file metadata. When the group does not exist in the current platform (which can happen if for example, the file came from another machine), then our code unexpectedly throws, stopping the archive creation process.
The correct behavior, and what this fix is introducing, is to imitate what other archiving tools like the Unix
tar
tool do: if the group name is not found, then leave that field blank. This allows the entry to be successfully added to the archive.Testing
Added sync and async unit tests to verify the correct behavior in all TAR formats that contain the GName field in the entry header metadata. The tests add a file, create a temporary group, change the group owner of the file to the newly created one, then delete the group, then attempt to add the file to a new archive using the same API that the customers are seeing in their crashes. The tests pass locally (in elevation mode) and in CI.
Risk
Low. This is a bug that does not match the behavior of other tools like the Unix
tar
tool. So ignoring the failure to retrieve the group name and writing blank is a better behavior than crashing.cc @baronfel @rainersigwald
IMPORTANT: Is this backport for a servicing release? If so and this change touches code that ships in a NuGet package, please make certain that you have added any necessary package authoring and gotten it explicitly reviewed.