From f7ec3102316cb209614f52afc5b069e33bcf6924 Mon Sep 17 00:00:00 2001
From: siegmund-heiss-ich
 <119589995+siegmund-heiss-ich@users.noreply.github.com>
Date: Fri, 9 Jun 2023 15:31:19 +0200
Subject: [PATCH] Check if existing oldConfigPath is a Symlink (#5271)

---
 src/Ryujinx.Common/Configuration/AppDataManager.cs | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/Ryujinx.Common/Configuration/AppDataManager.cs b/src/Ryujinx.Common/Configuration/AppDataManager.cs
index d6e7784304..b685e70647 100644
--- a/src/Ryujinx.Common/Configuration/AppDataManager.cs
+++ b/src/Ryujinx.Common/Configuration/AppDataManager.cs
@@ -96,7 +96,7 @@ namespace Ryujinx.Common.Configuration
             if (OperatingSystem.IsMacOS() && Mode == LaunchMode.UserProfile)
             {
                 string oldConfigPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), DefaultBaseDir);
-                if (Path.Exists(oldConfigPath) && !Path.Exists(BaseDirPath))
+                if (Path.Exists(oldConfigPath) && !IsPathSymlink(oldConfigPath) && !Path.Exists(BaseDirPath))
                 {
                     CopyDirectory(oldConfigPath, BaseDirPath);
                     Directory.Delete(oldConfigPath, true);
@@ -115,6 +115,14 @@ namespace Ryujinx.Common.Configuration
             Directory.CreateDirectory(KeysDirPath = Path.Combine(BaseDirPath, KeysDir));
         }
 
+        // Check if existing old baseDirPath is a symlink, to prevent possible errors.
+        // Should be removed, when the existance of the old directory isn't checked anymore.
+        private static bool IsPathSymlink(string path)
+        {
+            FileAttributes attributes = File.GetAttributes(path);
+            return (attributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint;
+        }
+
         private static void CopyDirectory(string sourceDir, string destinationDir)
         {
             var dir = new DirectoryInfo(sourceDir);