@@ -232,7 +232,7 @@ internal static SafeFileHandle Open(
232232 {
233233 created = false ;
234234 var directoryFlags = GetDirectoryFlags ( ) ;
235- var currentHandle = OpenPath ( "/" , directoryFlags , 0 ) ;
235+ var currentHandle = OpenPath ( "/" , directoryFlags ) ;
236236
237237 try
238238 {
@@ -347,9 +347,9 @@ private static string[] GetSegmentsAfterRoot(string path)
347347 StringSplitOptions . RemoveEmptyEntries ) ;
348348 }
349349
350- private static SafeFileHandle OpenPath ( string path , int flags , uint mode )
350+ private static SafeFileHandle OpenPath ( string path , int flags )
351351 {
352- var descriptor = OpenNative ( path , flags , mode ) ;
352+ var descriptor = OpenNative ( path , flags ) ;
353353 return CreateHandle ( descriptor , path ) ;
354354 }
355355
@@ -359,6 +359,21 @@ private static SafeFileHandle OpenAt(SafeFileHandle directory, string path, int
359359 return CreateHandle ( descriptor , path ) ;
360360 }
361361
362+ private static int OpenAtNative ( SafeFileHandle directory , string path , int flags , uint mode )
363+ {
364+ if ( RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) &&
365+ RuntimeInformation . ProcessArchitecture == Architecture . Arm64 )
366+ {
367+ // Apple's ARM64 openat reads its optional permissions argument from the stack,
368+ // not a register. Fill the five remaining argument registers so this fixed
369+ // P/Invoke signature puts mode on the stack, where the native function expects it.
370+ return OpenAtMacArm64 ( directory , path , flags ,
371+ IntPtr . Zero , IntPtr . Zero , IntPtr . Zero , IntPtr . Zero , IntPtr . Zero , mode ) ;
372+ }
373+
374+ return OpenAtDefault ( directory , path , flags , mode ) ;
375+ }
376+
362377 private static void CheckFile ( SafeFileHandle handle , bool rejectReadOnly )
363378 {
364379 ushort mode ;
@@ -429,10 +444,15 @@ private static SafeFileHandle CreateHandle(int descriptor, string path)
429444 }
430445
431446 [ DllImport ( "libc" , EntryPoint = "open" , SetLastError = true ) ]
432- private static extern int OpenNative ( string path , int flags , uint mode ) ;
447+ private static extern int OpenNative ( string path , int flags ) ;
448+
449+ [ DllImport ( "libc" , EntryPoint = "openat" , SetLastError = true ) ]
450+ private static extern int OpenAtDefault ( SafeFileHandle directoryDescriptor , string path , int flags , uint mode ) ;
433451
434452 [ DllImport ( "libc" , EntryPoint = "openat" , SetLastError = true ) ]
435- private static extern int OpenAtNative ( SafeFileHandle directoryDescriptor , string path , int flags , uint mode ) ;
453+ private static extern int OpenAtMacArm64 (
454+ SafeFileHandle directoryDescriptor , string path , int flags ,
455+ IntPtr unused3 , IntPtr unused4 , IntPtr unused5 , IntPtr unused6 , IntPtr unused7 , uint mode ) ;
436456
437457 [ DllImport ( "libc" , EntryPoint = "flock" , SetLastError = true ) ]
438458 private static extern int Flock ( SafeFileHandle descriptor , int operation ) ;
0 commit comments