]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39259: poplib now rejects timeout = 0 (GH-17912)
authorDong-hee Na <donghee.na92@gmail.com>
Fri, 10 Jan 2020 14:34:05 +0000 (23:34 +0900)
committerVictor Stinner <vstinner@python.org>
Fri, 10 Jan 2020 14:34:05 +0000 (15:34 +0100)
poplib.POP3 and poplib.POP3_SSL now raise a ValueError
if the given timeout for their constructor is zero to
prevent the creation of a non-blocking socket.

Doc/library/poplib.rst
Doc/whatsnew/3.9.rst
Lib/poplib.py
Lib/test/test_poplib.py
Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst [new file with mode: 0644]

index 28b42fa60c1859b2aadef2d44d053d20519e48b6..2f349b35b7e0ff393031de21b9154d7782a9ba6a 100644 (file)
@@ -47,6 +47,9 @@ The :mod:`poplib` module provides two classes:
       ``poplib.putline`` with arguments ``self`` and ``line``,
       where ``line`` is the bytes about to be sent to the remote host.
 
+   .. versionchanged:: 3.9
+      If the *timeout* parameter is set to be zero, it will raise a
+      :class:`ValueError` to prevent the creation of a non-blocking socket.
 
 .. class:: POP3_SSL(host, port=POP3_SSL_PORT, keyfile=None, certfile=None, timeout=None, context=None)
 
@@ -85,6 +88,10 @@ The :mod:`poplib` module provides two classes:
        :func:`ssl.create_default_context` select the system's trusted CA
        certificates for you.
 
+   .. versionchanged:: 3.9
+      If the *timeout* parameter is set to be zero, it will raise a
+      :class:`ValueError` to prevent the creation of a non-blocking socket.
+
 One exception is defined as an attribute of the :mod:`poplib` module:
 
 
@@ -268,4 +275,3 @@ retrieves and prints all messages::
 
 At the end of the module, there is a test section that contains a more extensive
 example of usage.
-
index ea6d8f515a944cd8313123398a77de0fbbddd310..3320b7cff42db09103cf426b10d1177e306f7387 100644 (file)
@@ -187,6 +187,13 @@ Exposed the Linux-specific :func:`os.pidfd_open` (:issue:`38692`) and
 :data:`os.P_PIDFD` (:issue:`38713`) for process management with file
 descriptors.
 
+poplib
+------
+
+:class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a :class:`ValueError`
+if the given timeout for their constructor is zero to prevent the creation of
+a non-blocking socket. (Contributed by Dong-hee Na in :issue:`39259`.)
+
 threading
 ---------
 
index 0b6750d2303760eb0285d71f443af74d3c27c40d..0f8587317c2bbc4c37c79b9112ffc281c67bcebd 100644 (file)
@@ -107,6 +107,8 @@ class POP3:
         self.welcome = self._getresp()
 
     def _create_socket(self, timeout):
+        if timeout is not None and not timeout:
+            raise ValueError('Non-blocking socket (timeout=0) is not supported')
         return socket.create_connection((self.host, self.port), timeout)
 
     def _putline(self, line):
index 911cba1f1dcd499c23a7bf72a4be2c83d36255c8..7f06d1950e1e142736ee8573db4f148bb6e6de81 100644 (file)
@@ -481,7 +481,7 @@ class TestTimeouts(TestCase):
         self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         self.sock.settimeout(60)  # Safety net. Look issue 11812
         self.port = test_support.bind_port(self.sock)
-        self.thread = threading.Thread(target=self.server, args=(self.evt,self.sock))
+        self.thread = threading.Thread(target=self.server, args=(self.evt, self.sock))
         self.thread.daemon = True
         self.thread.start()
         self.evt.wait()
@@ -505,12 +505,12 @@ class TestTimeouts(TestCase):
 
     def testTimeoutDefault(self):
         self.assertIsNone(socket.getdefaulttimeout())
-        socket.setdefaulttimeout(30)
+        socket.setdefaulttimeout(test_support.LOOPBACK_TIMEOUT)
         try:
             pop = poplib.POP3(HOST, self.port)
         finally:
             socket.setdefaulttimeout(None)
-        self.assertEqual(pop.sock.gettimeout(), 30)
+        self.assertEqual(pop.sock.gettimeout(), test_support.LOOPBACK_TIMEOUT)
         pop.close()
 
     def testTimeoutNone(self):
@@ -524,9 +524,11 @@ class TestTimeouts(TestCase):
         pop.close()
 
     def testTimeoutValue(self):
-        pop = poplib.POP3(HOST, self.port, timeout=30)
-        self.assertEqual(pop.sock.gettimeout(), 30)
+        pop = poplib.POP3(HOST, self.port, timeout=test_support.LOOPBACK_TIMEOUT)
+        self.assertEqual(pop.sock.gettimeout(), test_support.LOOPBACK_TIMEOUT)
         pop.close()
+        with self.assertRaises(ValueError):
+            poplib.POP3(HOST, self.port, timeout=0)
 
 
 def test_main():
diff --git a/Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst b/Misc/NEWS.d/next/Library/2020-01-09-10-58-58.bpo-39259.RmDgCC.rst
new file mode 100644 (file)
index 0000000..c7ef8be
--- /dev/null
@@ -0,0 +1,3 @@
+:class:`~poplib.POP3` and :class:`~poplib.POP3_SSL` now raise a
+:class:`ValueError` if the given timeout for their constructor is zero to
+prevent the creation of a non-blocking socket. Patch by Dong-hee Na.