server: Allow to create win23 prefix when directory already exists.

Sebastian Lackner sebastian at fds-team.de
Wed Sep 21 08:11:35 CDT 2016


Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---

Please note that the existing solution has race-conditions, and does not work correctly
when a second process gets past the directory check before the first process has created
the system.reg file. The best way to avoid any type of race conditions is by moving this
check to the wineserver. It would also make sense because all other modifications of
system.reg are also done on the wineserver side.

 dlls/ntdll/server.c |   11 -----------
 server/registry.c   |    8 +++++++-
 2 files changed, 7 insertions(+), 12 deletions(-)

diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c
index 356d631..25c6473 100644
--- a/dlls/ntdll/server.c
+++ b/dlls/ntdll/server.c
@@ -1139,17 +1139,6 @@ static void setup_config_dir(void)
         mkdir( config_dir, 0777 );
         if (chdir( config_dir ) == -1) fatal_perror( "chdir to %s\n", config_dir );
 
-        if ((p = getenv( "WINEARCH" )) && !strcmp( p, "win32" ))
-        {
-            /* force creation of a 32-bit prefix */
-            int fd = open( "system.reg", O_WRONLY | O_CREAT | O_EXCL, 0666 );
-            if (fd != -1)
-            {
-                static const char regfile[] = "WINE REGISTRY Version 2\n\n#arch=win32\n";
-                write( fd, regfile, sizeof(regfile) - 1 );
-                close( fd );
-            }
-        }
         MESSAGE( "wine: created the configuration directory '%s'\n", config_dir );
     }
 
diff --git a/server/registry.c b/server/registry.c
index 97b16ed..0731b22 100644
--- a/server/registry.c
+++ b/server/registry.c
@@ -1805,6 +1805,7 @@ void init_registry(void)
     WCHAR *current_user_path;
     struct unicode_str current_user_str;
     struct key *key, *hklm, *hkcu;
+    char *p;
 
     /* switch to the config dir */
 
@@ -1821,7 +1822,12 @@ void init_registry(void)
         fatal_error( "could not create Machine registry key\n" );
 
     if (!load_init_registry_from_file( "system.reg", hklm ))
-        prefix_type = sizeof(void *) > sizeof(int) ? PREFIX_64BIT : PREFIX_32BIT;
+    {
+        if ((p = getenv( "WINEARCH" )) && !strcmp( p, "win32" ))
+            prefix_type = PREFIX_32BIT;
+        else
+            prefix_type = sizeof(void *) > sizeof(int) ? PREFIX_64BIT : PREFIX_32BIT;
+    }
     else if (prefix_type == PREFIX_UNKNOWN)
         prefix_type = PREFIX_32BIT;
 
-- 
2.9.0



More information about the wine-patches mailing list