From fe5c65f4cf1030293c8955eae49f69aca4fbda36 Mon Sep 17 00:00:00 2001
From: Carsten Igel <1760987+carstencodes@users.noreply.github.com>
Date: Wed, 13 Dec 2023 00:02:02 +0100
Subject: [PATCH] chore: Corrected file mode calculation

---
 src/Bundler.IO/ArStreamWriter.cs | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/src/Bundler.IO/ArStreamWriter.cs b/src/Bundler.IO/ArStreamWriter.cs
index 0f2fc38..9754bbd 100644
--- a/src/Bundler.IO/ArStreamWriter.cs
+++ b/src/Bundler.IO/ArStreamWriter.cs
@@ -89,14 +89,23 @@ public class ArStreamWriter(Stream stream) : BinaryWriter(stream)
 
     private async Task WriteFilePermissionsAsync(UnixFileMode fileMode, CancellationToken cancellationToken)
     {
+        const UnixFileMode allUserFields = UnixFileMode.UserExecute | UnixFileMode.UserRead | UnixFileMode.UserWrite;
+        const UnixFileMode allGroupFields = UnixFileMode.GroupExecute | UnixFileMode.GroupRead | UnixFileMode.GroupWrite;
+        const UnixFileMode allOtherFields = UnixFileMode.OtherExecute | UnixFileMode.OtherRead | UnixFileMode.OtherWrite;
+        
+        const byte byteShiftUserField = 8; // Min Value = 64, Max Value = 256
+        const byte byteShiftGroupField = 4; // Min Value = 8, Max Value = 32
+        const byte byteShiftOtherField = 0; // Min Value = 1, Max Value = 4
+        
         // 8 byte file mode
         Memory<byte> bytes = new();
         bytes.Span[0] = 1; // regular file
         bytes.Span[1] = 0; 
         bytes.Span[2] = 0;
-        bytes.Span[3] = 0; // User
-        bytes.Span[4] = 0; // Group
-        bytes.Span[5] = 0; // Other
+        
+        bytes.Span[3] = Convert.ToByte((byte)(fileMode & allUserFields) >> byteShiftUserField); // User
+        bytes.Span[4] = Convert.ToByte((byte)(fileMode & allGroupFields) >> byteShiftGroupField); // Group
+        bytes.Span[5] = Convert.ToByte((byte)(fileMode & allOtherFields) >> byteShiftOtherField); // Other
         bytes.Span[5] = PAD; // PAD
         bytes.Span[5] = PAD; // PAD
         
-- 
GitLab