Commit 83a2c287 authored by Victor Stinner's avatar Victor Stinner Committed by GitHub

bpo-30329: Catch Windows error 10022 on shutdown() (#1538)

Catch the Windows socket WSAEINVAL error (code 10022) in imaplib and
poplib on shutdown(SHUT_RDWR): An invalid operation was attempted

This error occurs sometimes on SSL connections.
parent edef358e
...@@ -318,9 +318,12 @@ class IMAP4: ...@@ -318,9 +318,12 @@ class IMAP4:
self.file.close() self.file.close()
try: try:
self.sock.shutdown(socket.SHUT_RDWR) self.sock.shutdown(socket.SHUT_RDWR)
except OSError as e: except OSError as exc:
# The server might already have closed the connection # The server might already have closed the connection.
if e.errno != errno.ENOTCONN: # On Windows, this may result in WSAEINVAL (error 10022):
# An invalid operation was attempted.
if (exc.errno != errno.ENOTCONN
and getattr(exc, 'winerror', 0) != 10022):
raise raise
finally: finally:
self.sock.close() self.sock.close()
......
...@@ -288,9 +288,12 @@ class POP3: ...@@ -288,9 +288,12 @@ class POP3:
if sock is not None: if sock is not None:
try: try:
sock.shutdown(socket.SHUT_RDWR) sock.shutdown(socket.SHUT_RDWR)
except OSError as e: except OSError as exc:
# The server might already have closed the connection # The server might already have closed the connection.
if e.errno != errno.ENOTCONN: # On Windows, this may result in WSAEINVAL (error 10022):
# An invalid operation was attempted.
if (exc.errno != errno.ENOTCONN
and getattr(exc, 'winerror', 0) != 10022):
raise raise
finally: finally:
sock.close() sock.close()
......
...@@ -323,6 +323,10 @@ Extension Modules ...@@ -323,6 +323,10 @@ Extension Modules
Library Library
------- -------
- bpo-30329: imaplib and poplib now catch the Windows socket WSAEINVAL error
(code 10022) on shutdown(SHUT_RDWR): An invalid operation was attempted.
This error occurs sometimes on SSL connections.
- bpo-29196: Removed previously deprecated in Python 2.4 classes Plist, Dict - bpo-29196: Removed previously deprecated in Python 2.4 classes Plist, Dict
and _InternalDict in the plistlib module. Dict values in the result of and _InternalDict in the plistlib module. Dict values in the result of
functions readPlist() and readPlistFromBytes() are now normal dicts. You functions readPlist() and readPlistFromBytes() are now normal dicts. You
......
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