where the host byte order is the same as network byte order, this is a no-op;
otherwise, it performs a 2-byte swap operation.
- .. deprecated:: 3.7
- In case *x* does not fit in 16-bit unsigned integer, but does fit in a
- positive C int, it is silently truncated to 16-bit unsigned integer.
- This silent truncation feature is deprecated, and will raise an
- exception in future versions of Python.
+ .. versionchanged:: 3.10
+ Raises :exc:`OverflowError` if *x* does not fit in a 16-bit unsigned
+ integer.
.. function:: htonl(x)
where the host byte order is the same as network byte order, this is a no-op;
otherwise, it performs a 2-byte swap operation.
- .. deprecated:: 3.7
- In case *x* does not fit in 16-bit unsigned integer, but does fit in a
- positive C int, it is silently truncated to 16-bit unsigned integer.
- This silent truncation feature is deprecated, and will raise an
- exception in future versions of Python.
+ .. versionchanged:: 3.10
+ Raises :exc:`OverflowError` if *x* does not fit in a 16-bit unsigned
+ integer.
.. function:: inet_aton(ip_string)
silently in Python 3.9.
(Contributed by Ken Jin in :issue:`42195`.)
+* :meth:`socket.htons` and :meth:`socket.ntohs` now raise :exc:`OverflowError`
+ instead of :exc:`DeprecationWarning` if the given parameter will not fit in
+ a 16-bit unsigned integer.
+ (Contributed by Erlend E. Aasland in :issue:`42393`.)
+
+
CPython bytecode changes
========================
s_good_values = [0, 1, 2, 0xffff]
l_good_values = s_good_values + [0xffffffff]
l_bad_values = [-1, -2, 1<<32, 1<<1000]
- s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
- _testcapi.INT_MAX + 1]
- s_deprecated_values = [1<<16, _testcapi.INT_MAX]
+ s_bad_values = (
+ l_bad_values +
+ [_testcapi.INT_MIN-1, _testcapi.INT_MAX+1] +
+ [1 << 16, _testcapi.INT_MAX]
+ )
for k in s_good_values:
socket.ntohs(k)
socket.htons(k)
for k in l_bad_values:
self.assertRaises(OverflowError, socket.ntohl, k)
self.assertRaises(OverflowError, socket.htonl, k)
- for k in s_deprecated_values:
- self.assertWarns(DeprecationWarning, socket.ntohs, k)
- self.assertWarns(DeprecationWarning, socket.htons, k)
def testGetServBy(self):
eq = self.assertEqual
--- /dev/null
+Raise :exc:`OverflowError` instead of silent truncation in :meth:`socket.ntohs`
+and :meth:`socket.htons`. Silent truncation was deprecated in Python 3.7.
+Patch by Erlend E. Aasland
return NULL;
}
if (x > 0xffff) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "ntohs: Python int too large to convert to C "
- "16-bit unsigned integer (The silent truncation "
- "is deprecated)",
- 1)) {
- return NULL;
- }
+ PyErr_SetString(PyExc_OverflowError,
+ "ntohs: Python int too large to convert to C "
+ "16-bit unsigned integer");
+ return NULL;
}
return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
}
PyDoc_STRVAR(ntohs_doc,
"ntohs(integer) -> integer\n\
\n\
-Convert a 16-bit unsigned integer from network to host byte order.\n\
-Note that in case the received integer does not fit in 16-bit unsigned\n\
-integer, but does fit in a positive C int, it is silently truncated to\n\
-16-bit unsigned integer.\n\
-However, this silent truncation feature is deprecated, and will raise an\n\
-exception in future versions of Python.");
+Convert a 16-bit unsigned integer from network to host byte order.");
static PyObject *
return NULL;
}
if (x > 0xffff) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning,
- "htons: Python int too large to convert to C "
- "16-bit unsigned integer (The silent truncation "
- "is deprecated)",
- 1)) {
- return NULL;
- }
+ PyErr_SetString(PyExc_OverflowError,
+ "htons: Python int too large to convert to C "
+ "16-bit unsigned integer");
+ return NULL;
}
return PyLong_FromUnsignedLong(htons((unsigned short)x));
}
PyDoc_STRVAR(htons_doc,
"htons(integer) -> integer\n\
\n\
-Convert a 16-bit unsigned integer from host to network byte order.\n\
-Note that in case the received integer does not fit in 16-bit unsigned\n\
-integer, but does fit in a positive C int, it is silently truncated to\n\
-16-bit unsigned integer.\n\
-However, this silent truncation feature is deprecated, and will raise an\n\
-exception in future versions of Python.");
+Convert a 16-bit unsigned integer from host to network byte order.");
static PyObject *