summaryrefslogtreecommitdiff
path: root/sql-common
diff options
context:
space:
mode:
authorDavi Arnaut <Davi.Arnaut@Sun.COM>2009-06-10 10:59:59 -0300
committerDavi Arnaut <Davi.Arnaut@Sun.COM>2009-06-10 10:59:59 -0300
commitafacea4d602bd2230791bd7a91f51e380e00f5d0 (patch)
tree809678828e315abb0007c3d6c0fa12f66fcf249b /sql-common
parenta073ee45c290d81d365b48b03ef6924e778cd64f (diff)
downloadmariadb-git-afacea4d602bd2230791bd7a91f51e380e00f5d0.tar.gz
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.
Diffstat (limited to 'sql-common')
-rw-r--r--sql-common/client.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/sql-common/client.c b/sql-common/client.c
index 27cc110401c..5475d5d5160 100644
--- a/sql-common/client.c
+++ b/sql-common/client.c
@@ -412,6 +412,9 @@ HANDLE create_shared_memory(MYSQL *mysql,NET *net, uint connect_timeout)
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,NET *net, uint connect_timeout)
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,NET *net, uint connect_timeout)
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)