From 29571381531de145e03aef7056d0f8ed95b7deb8 Mon Sep 17 00:00:00 2001 From: Felix Fontein Date: Thu, 1 Dec 2022 06:59:05 +0100 Subject: [PATCH] latest docker-py bugfix (npipe) (#513) * socket: handle npipe close on Windows (https://github.com/docker/docker-py/pull/3056) Fixes https://github.com/docker/docker-py/issues/3045 Cherry-picked from https://github.com/docker/docker-py/commit/30022984f6445fbc322cbe97bb99aab1ddb1e4fd Co-authored-by: Nick Santos * Add changelog fragment. Co-authored-by: Nick Santos --- changelogs/fragments/513-api-npipe.yml | 2 ++ plugins/module_utils/_api/utils/socket.py | 14 ++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 changelogs/fragments/513-api-npipe.yml diff --git a/changelogs/fragments/513-api-npipe.yml b/changelogs/fragments/513-api-npipe.yml new file mode 100644 index 000000000..1503c57ab --- /dev/null +++ b/changelogs/fragments/513-api-npipe.yml @@ -0,0 +1,2 @@ +bugfixes: + - "vendored latest Docker SDK for Python bugfix (https://github.com/ansible-collections/community.docker/pull/513, https://github.com/docker/docker-py/issues/3045)." diff --git a/plugins/module_utils/_api/utils/socket.py b/plugins/module_utils/_api/utils/socket.py index b47210223..81c0c4f87 100644 --- a/plugins/module_utils/_api/utils/socket.py +++ b/plugins/module_utils/_api/utils/socket.py @@ -29,6 +29,11 @@ class SocketError(Exception): pass +# NpipeSockets have their own error types +# pywintypes.error: (109, 'ReadFile', 'The pipe has been ended.') +NPIPE_ENDED = 109 + + def read(socket, n=4096): """ Reads at most n bytes from socket @@ -48,6 +53,15 @@ def read(socket, n=4096): except EnvironmentError as e: if e.errno not in recoverable_errors: raise + except Exception as e: + is_pipe_ended = (isinstance(socket, NpipeSocket) and + len(e.args) > 0 and + e.args[0] == NPIPE_ENDED) + if is_pipe_ended: + # npipes don't support duplex sockets, so we interpret + # a PIPE_ENDED error as a close operation (0-length read). + return 0 + raise def read_exactly(socket, n):