mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
A fix for Bug#8226 "Cannot connect via shared memory":
provide created shared memory objects with proper access rights to make them usable when client and server are running under different accounts. Post review fixes.
This commit is contained in:
@ -3817,10 +3817,19 @@ pthread_handler_decl(handle_connections_shared_memory,arg)
|
||||
char *suffix_pos;
|
||||
char connect_number_char[22], *p;
|
||||
const char *errmsg= 0;
|
||||
SECURITY_ATTRIBUTES *sa_event= 0, *sa_mapping= 0;
|
||||
my_thread_init();
|
||||
DBUG_ENTER("handle_connections_shared_memorys");
|
||||
DBUG_PRINT("general",("Waiting for allocated shared memory."));
|
||||
|
||||
if (my_security_attr_create(&sa_event, &errmsg,
|
||||
GENERIC_ALL, SYNCHRONIZE | EVENT_MODIFY_STATE))
|
||||
goto error;
|
||||
|
||||
if (my_security_attr_create(&sa_mapping, &errmsg,
|
||||
GENERIC_ALL, FILE_MAP_READ | FILE_MAP_WRITE))
|
||||
goto error;
|
||||
|
||||
/*
|
||||
The name of event and file-mapping events create agree next rule:
|
||||
shared_memory_base_name+unique_part
|
||||
@ -3830,22 +3839,22 @@ pthread_handler_decl(handle_connections_shared_memory,arg)
|
||||
*/
|
||||
suffix_pos= strxmov(tmp,shared_memory_base_name,"_",NullS);
|
||||
strmov(suffix_pos, "CONNECT_REQUEST");
|
||||
if ((smem_event_connect_request= CreateEvent(0,FALSE,FALSE,tmp)) == 0)
|
||||
if ((smem_event_connect_request= CreateEvent(sa_event,
|
||||
FALSE, FALSE, tmp)) == 0)
|
||||
{
|
||||
errmsg= "Could not create request event";
|
||||
goto error;
|
||||
}
|
||||
strmov(suffix_pos, "CONNECT_ANSWER");
|
||||
if ((event_connect_answer= CreateEvent(0,FALSE,FALSE,tmp)) == 0)
|
||||
if ((event_connect_answer= CreateEvent(sa_event, FALSE, FALSE, tmp)) == 0)
|
||||
{
|
||||
errmsg="Could not create answer event";
|
||||
goto error;
|
||||
}
|
||||
strmov(suffix_pos, "CONNECT_DATA");
|
||||
if ((handle_connect_file_map= CreateFileMapping(INVALID_HANDLE_VALUE,0,
|
||||
PAGE_READWRITE,
|
||||
0,sizeof(connect_number),
|
||||
tmp)) == 0)
|
||||
if ((handle_connect_file_map=
|
||||
CreateFileMapping(INVALID_HANDLE_VALUE, sa_mapping,
|
||||
PAGE_READWRITE, 0, sizeof(connect_number), tmp)) == 0)
|
||||
{
|
||||
errmsg= "Could not create file mapping";
|
||||
goto error;
|
||||
@ -3890,10 +3899,9 @@ pthread_handler_decl(handle_connections_shared_memory,arg)
|
||||
suffix_pos= strxmov(tmp,shared_memory_base_name,"_",connect_number_char,
|
||||
"_",NullS);
|
||||
strmov(suffix_pos, "DATA");
|
||||
if ((handle_client_file_map= CreateFileMapping(INVALID_HANDLE_VALUE,0,
|
||||
PAGE_READWRITE,0,
|
||||
smem_buffer_length,
|
||||
tmp)) == 0)
|
||||
if ((handle_client_file_map=
|
||||
CreateFileMapping(INVALID_HANDLE_VALUE, sa_mapping,
|
||||
PAGE_READWRITE, 0, smem_buffer_length, tmp)) == 0)
|
||||
{
|
||||
errmsg= "Could not create file mapping";
|
||||
goto errorconn;
|
||||
@ -3906,31 +3914,33 @@ pthread_handler_decl(handle_connections_shared_memory,arg)
|
||||
goto errorconn;
|
||||
}
|
||||
strmov(suffix_pos, "CLIENT_WROTE");
|
||||
if ((event_client_wrote= CreateEvent(0, FALSE, FALSE, tmp)) == 0)
|
||||
if ((event_client_wrote= CreateEvent(sa_event, FALSE, FALSE, tmp)) == 0)
|
||||
{
|
||||
errmsg= "Could not create client write event";
|
||||
goto errorconn;
|
||||
}
|
||||
strmov(suffix_pos, "CLIENT_READ");
|
||||
if ((event_client_read= CreateEvent(0, FALSE, FALSE, tmp)) == 0)
|
||||
if ((event_client_read= CreateEvent(sa_event, FALSE, FALSE, tmp)) == 0)
|
||||
{
|
||||
errmsg= "Could not create client read event";
|
||||
goto errorconn;
|
||||
}
|
||||
strmov(suffix_pos, "SERVER_READ");
|
||||
if ((event_server_read= CreateEvent(0, FALSE, FALSE, tmp)) == 0)
|
||||
if ((event_server_read= CreateEvent(sa_event, FALSE, FALSE, tmp)) == 0)
|
||||
{
|
||||
errmsg= "Could not create server read event";
|
||||
goto errorconn;
|
||||
}
|
||||
strmov(suffix_pos, "SERVER_WROTE");
|
||||
if ((event_server_wrote= CreateEvent(0, FALSE, FALSE, tmp)) == 0)
|
||||
if ((event_server_wrote= CreateEvent(sa_event,
|
||||
FALSE, FALSE, tmp)) == 0)
|
||||
{
|
||||
errmsg= "Could not create server write event";
|
||||
goto errorconn;
|
||||
}
|
||||
strmov(suffix_pos, "CONNECTION_CLOSED");
|
||||
if ((event_conn_closed= CreateEvent(0, TRUE , FALSE, tmp)) == 0)
|
||||
if ((event_conn_closed= CreateEvent(sa_event,
|
||||
TRUE, FALSE, tmp)) == 0)
|
||||
{
|
||||
errmsg= "Could not create closed connection event";
|
||||
goto errorconn;
|
||||
@ -3980,6 +3990,8 @@ errorconn:
|
||||
NullS);
|
||||
sql_perror(buff);
|
||||
}
|
||||
my_security_attr_free(sa_event);
|
||||
my_security_attr_free(sa_mapping);
|
||||
if (handle_client_file_map)
|
||||
CloseHandle(handle_client_file_map);
|
||||
if (handle_client_map)
|
||||
@ -4005,6 +4017,8 @@ error:
|
||||
strxmov(buff, "Can't create shared memory service: ", errmsg, ".", NullS);
|
||||
sql_perror(buff);
|
||||
}
|
||||
my_security_attr_free(sa_event);
|
||||
my_security_attr_free(sa_mapping);
|
||||
if (handle_connect_map) UnmapViewOfFile(handle_connect_map);
|
||||
if (handle_connect_file_map) CloseHandle(handle_connect_file_map);
|
||||
if (event_connect_answer) CloseHandle(event_connect_answer);
|
||||
|
Reference in New Issue
Block a user