The PR fixes bugs with HvsockConnCloseRead/Write where shutdown is attempted on closed sockets, which returns a cryptic error: close hvsock [...]: shutdown: An operation was attempted on something that is not a socket, and where the (*HvsockConn).shutdown function was not respecting whether to close a socket for reading or writing, and only shutting down the pipe for reading.
It attempts to shutdown a closed socket, which then calls syscall.Shutdown on a null socket handle. This PR preemptively returns ErrFileClosed to prevent that, and allow upstream callers to check for the situation where the socket is already closed.
(*HvsockConn).CloseWrite does not actually close the connection for writing, since (*HvsockConn).shutdown ignores its parameter and closes the socket only for reading. This prevents hcsshim from using CloseWrite (from within (*Process).CloseStdin) to stop the copy operation from upstream pipes into the processes std in.
This PR fixes those issues.
Additionally, two functions have been added:
(*HvsockConn).CloseReadWrite to expose shutting down both ends of the socket.
(*win32File).IsClosed (and therefore win32Pipe and win32MessageBytePipe) and (*HvsockConn).IsClosed and to check if the socket/pipe has already been closed, since the structs already track internally if they have been closed or not.
The PR fixes bugs with
HvsockConn
CloseRead
/Write
where shutdown is attempted on closed sockets, which returns a cryptic error:close hvsock [...]: shutdown: An operation was attempted on something that is not a socket
, and where the(*HvsockConn).shutdown
function was not respecting whether to close a socket for reading or writing, and only shutting down the pipe for reading.Currently,
(*Process).CloseStdin
runs into two issues:syscall.Shutdown
on a null socket handle. This PR preemptively returnsErrFileClosed
to prevent that, and allow upstream callers to check for the situation where the socket is already closed.(*HvsockConn).CloseWrite
does not actually close the connection for writing, since(*HvsockConn).shutdown
ignores its parameter and closes the socket only for reading. This prevents hcsshim from usingCloseWrite
(from within(*Process).CloseStdin
) to stop the copy operation from upstream pipes into the processesstd in
.This PR fixes those issues.
Additionally, two functions have been added:
(*HvsockConn).CloseReadWrite
to expose shutting down both ends of the socket.(*win32File).IsClosed
(and thereforewin32Pipe
andwin32MessageBytePipe
) and(*HvsockConn).IsClosed
and to check if the socket/pipe has already been closed, since the structs already track internally if they have been closed or not.Signed-off-by: Hamza El-Saawy hamzaelsaawy@microsoft.com