Commit ccb9f673 authored by Vladislav Vaintroub's avatar Vladislav Vaintroub

MDEV-23348 vio_shutdown does not prevent later ReadFile on named pipe

Introduce st_vio::shutdown_flag to be checked prior to Read/WriteFile
and during wait for async.io to finish.
parent 4d41f316
...@@ -281,6 +281,7 @@ struct st_vio ...@@ -281,6 +281,7 @@ struct st_vio
OVERLAPPED overlapped; OVERLAPPED overlapped;
DWORD read_timeout_ms; DWORD read_timeout_ms;
DWORD write_timeout_ms; DWORD write_timeout_ms;
int shutdown_flag;
#endif #endif
}; };
#endif /* vio_violite_h_ */ #endif /* vio_violite_h_ */
...@@ -68,6 +68,7 @@ int vio_shared_memory_shutdown(Vio *vio, int how) ...@@ -68,6 +68,7 @@ int vio_shared_memory_shutdown(Vio *vio, int how)
int vio_pipe_shutdown(Vio *vio, int how) int vio_pipe_shutdown(Vio *vio, int how)
{ {
vio->shutdown_flag= how;
return CancelIoEx(vio->hPipe, NULL); return CancelIoEx(vio->hPipe, NULL);
} }
#endif #endif
......
...@@ -75,6 +75,9 @@ size_t vio_read_pipe(Vio *vio, uchar *buf, size_t count) ...@@ -75,6 +75,9 @@ size_t vio_read_pipe(Vio *vio, uchar *buf, size_t count)
size_t ret= (size_t) -1; size_t ret= (size_t) -1;
DBUG_ENTER("vio_read_pipe"); DBUG_ENTER("vio_read_pipe");
if (vio->shutdown_flag)
return ret;
disable_iocp_notification(&vio->overlapped); disable_iocp_notification(&vio->overlapped);
/* Attempt to read from the pipe (overlapped I/O). */ /* Attempt to read from the pipe (overlapped I/O). */
...@@ -85,8 +88,11 @@ size_t vio_read_pipe(Vio *vio, uchar *buf, size_t count) ...@@ -85,8 +88,11 @@ size_t vio_read_pipe(Vio *vio, uchar *buf, size_t count)
} }
/* Read operation is pending completion asynchronously? */ /* Read operation is pending completion asynchronously? */
else if (GetLastError() == ERROR_IO_PENDING) else if (GetLastError() == ERROR_IO_PENDING)
{
if (vio->shutdown_flag)
CancelIo(vio->hPipe);
ret= wait_overlapped_result(vio, vio->read_timeout); ret= wait_overlapped_result(vio, vio->read_timeout);
}
enable_iocp_notification(&vio->overlapped); enable_iocp_notification(&vio->overlapped);
DBUG_RETURN(ret); DBUG_RETURN(ret);
...@@ -99,6 +105,8 @@ size_t vio_write_pipe(Vio *vio, const uchar *buf, size_t count) ...@@ -99,6 +105,8 @@ size_t vio_write_pipe(Vio *vio, const uchar *buf, size_t count)
size_t ret= (size_t) -1; size_t ret= (size_t) -1;
DBUG_ENTER("vio_write_pipe"); DBUG_ENTER("vio_write_pipe");
if (vio->shutdown_flag == SHUT_RDWR)
return ret;
disable_iocp_notification(&vio->overlapped); disable_iocp_notification(&vio->overlapped);
/* Attempt to write to the pipe (overlapped I/O). */ /* Attempt to write to the pipe (overlapped I/O). */
if (WriteFile(vio->hPipe, buf, (DWORD)count, &transferred, &vio->overlapped)) if (WriteFile(vio->hPipe, buf, (DWORD)count, &transferred, &vio->overlapped))
...@@ -108,8 +116,11 @@ size_t vio_write_pipe(Vio *vio, const uchar *buf, size_t count) ...@@ -108,8 +116,11 @@ size_t vio_write_pipe(Vio *vio, const uchar *buf, size_t count)
} }
/* Write operation is pending completion asynchronously? */ /* Write operation is pending completion asynchronously? */
else if (GetLastError() == ERROR_IO_PENDING) else if (GetLastError() == ERROR_IO_PENDING)
{
if (vio->shutdown_flag == SHUT_RDWR)
CancelIo(vio->hPipe);
ret= wait_overlapped_result(vio, vio->write_timeout); ret= wait_overlapped_result(vio, vio->write_timeout);
}
enable_iocp_notification(&vio->overlapped); enable_iocp_notification(&vio->overlapped);
DBUG_RETURN(ret); DBUG_RETURN(ret);
} }
...@@ -129,9 +140,7 @@ int vio_close_pipe(Vio *vio) ...@@ -129,9 +140,7 @@ int vio_close_pipe(Vio *vio)
BOOL ret; BOOL ret;
DBUG_ENTER("vio_close_pipe"); DBUG_ENTER("vio_close_pipe");
CancelIo(vio->hPipe);
CloseHandle(vio->overlapped.hEvent); CloseHandle(vio->overlapped.hEvent);
DisconnectNamedPipe(vio->hPipe);
ret= CloseHandle(vio->hPipe); ret= CloseHandle(vio->hPipe);
vio->type= VIO_CLOSED; vio->type= VIO_CLOSED;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment