mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
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.
This commit is contained in:
parent
dae006c17f
commit
425790610d
1 changed files with 16 additions and 4 deletions
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue