List:Commits« Previous MessageNext Message »
From:Davi Arnaut Date:June 10 2009 2:00pm
Subject:bzr commit into mysql-5.0-bugteam branch (davi:2769) Bug#41190
View as plain text  
# At a local mysql-5.0-bugteam repository of davi

 2769 Davi Arnaut	2009-06-10
      Bug#41190: shared memory connections do not work in Vista, if server started from cmdline
      
      Backport to MySQL 5.0/1 fix by Vladislav Vaintroub:
      
      In Vista and later and also in when using terminal services, when
      server is started from  command line, client cannot connect to it
      via shared memory protocol.
      
      This is a regression introduced when  Bug#24731 was fixed.  The
      reason is that client is trying to attach to shared memory using
      global kernel object  namespace (all kernel objects are prefixed
      with Global\). However, server started from the command line in
      Vista and later will create shared memory and events using current
      session namespace. Thus, client is unable to find the server and
      connection fails.
      
      The fix for the client is to first try to find server using "local"
      names  (omitting Global\  prefix) and only if server is not found,
      trying global namespace.

    modified:
      sql-common/client.c
=== modified file 'sql-common/client.c'
--- a/sql-common/client.c	2009-02-10 22:47:54 +0000
+++ b/sql-common/client.c	2009-06-10 13:59:59 +0000
@@ -412,6 +412,9 @@ HANDLE create_shared_memory(MYSQL *mysql
   DWORD error_code = 0;
   DWORD event_access_rights= SYNCHRONIZE | EVENT_MODIFY_STATE;
   char *shared_memory_base_name = mysql->options.shared_memory_base_name;
+  static const char *name_prefixes[] = {"","Global\\"};
+  const char *prefix;
+  int i;
 
   /*
      get enough space base-name + '_' + longest suffix we might ever send
@@ -426,9 +429,18 @@ HANDLE create_shared_memory(MYSQL *mysql
     shared_memory_base_name is unique value for each server
     unique_part is uniquel value for each object (events and file-mapping)
   */
-  suffix_pos = strxmov(tmp, "Global\\", shared_memory_base_name, "_", NullS);
-  strmov(suffix_pos, "CONNECT_REQUEST");
-  if (!(event_connect_request= OpenEvent(event_access_rights, FALSE, tmp)))
+  for (i = 0; i< array_elements(name_prefixes); i++)
+  {
+    prefix= name_prefixes[i];
+    suffix_pos = strxmov(tmp, prefix , shared_memory_base_name, "_", NullS);
+    strmov(suffix_pos, "CONNECT_REQUEST");
+    event_connect_request= OpenEvent(event_access_rights, FALSE, tmp);
+    if (event_connect_request)
+    {
+      break;
+    }
+  }
+  if (!event_connect_request)
   {
     error_allow = CR_SHARED_MEMORY_CONNECT_REQUEST_ERROR;
     goto err;
@@ -480,7 +492,7 @@ HANDLE create_shared_memory(MYSQL *mysql
     unique_part is uniquel value for each object (events and file-mapping)
     number_of_connection is number of connection between server and client
   */
-  suffix_pos = strxmov(tmp, "Global\\", shared_memory_base_name, "_", connect_number_char,
+  suffix_pos = strxmov(tmp, prefix , shared_memory_base_name, "_", connect_number_char,
 		       "_", NullS);
   strmov(suffix_pos, "DATA");
   if ((handle_file_map = OpenFileMapping(FILE_MAP_WRITE,FALSE,tmp)) == NULL)


Attachment: [text/bzr-bundle] bzr/davi.arnaut@sun.com-20090610135959-qxcnown5oqkdhocj.bundle
Thread
bzr commit into mysql-5.0-bugteam branch (davi:2769) Bug#41190Davi Arnaut10 Jun