Skip to content
25 changes: 25 additions & 0 deletions Lib/test/test_socket.py
Original file line number Diff line number Diff line change
Expand Up @@ -1538,6 +1538,31 @@ def testSetSockOpt(self):
reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
self.assertFalse(reuse == 0, "failed to set reuse mode")

@unittest.skipIf(_testcapi is None, "requires _testcapi")
def test_setsockopt_errors(self):
# See issue #107546.
from _testcapi import INT_MAX, INT_MIN

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.addCleanup(sock.close)

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # No error expected.

with self.assertRaises(OverflowError):
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, INT_MAX + 1)

with self.assertRaises(OverflowError):
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, INT_MIN - 1)

with self.assertRaises(OverflowError):
sock.setsockopt(socket.SOL_SOCKET, INT_MAX + 1, 1)

with self.assertRaises(OverflowError):
sock.setsockopt(INT_MAX + 1, socket.SO_REUSEADDR, 1)

with self.assertRaises(TypeError):
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, dict())

def testSendAfterClose(self):
# testing send() after close() with timeout
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Improve error message when :meth:`~socket.socket.setsockopt` raises an error
other than a :exc:`TypeError`.
6 changes: 6 additions & 0 deletions Modules/socketmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -3373,6 +3373,9 @@ sock_setsockopt(PyObject *self, PyObject *args)
(char*)&flag, sizeof flag);
goto done;
}
if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
return NULL;
}

PyErr_Clear();
/* setsockopt(level, opt, None, flag) */
Expand All @@ -3383,6 +3386,9 @@ sock_setsockopt(PyObject *self, PyObject *args)
NULL, (socklen_t)optlen);
goto done;
}
if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
return NULL;
}

PyErr_Clear();
/* setsockopt(level, opt, buffer) */
Expand Down
Loading