summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Gutierrez <chibby0ne@gmail.com>2019-10-08 06:22:17 +0200
committerBenjamin Peterson <benjamin@python.org>2019-10-07 21:22:17 -0700
commit0d3fe8ae4961bf551e7d5e42559e2ede1a08fd7c (patch)
tree8ddcbaae6fdebf3694b166b58995aa849b812f3d
parent4d5f94b8cd20f804c7868c5395a15aa6032f874c (diff)
downloadcpython-git-0d3fe8ae4961bf551e7d5e42559e2ede1a08fd7c.tar.gz
closes bpo-38402: Check error of primitive crypt/crypt_r. (GH-16599)
Checks also for encryption algorithms methods not supported in different OSs. Signed-off-by: Antonio Gutierrez <chibby0ne@gmail.com>
-rw-r--r--Lib/crypt.py10
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2019-10-05-19-36-16.bpo-38402.EZuzgK.rst1
-rw-r--r--Modules/_cryptmodule.c3
3 files changed, 13 insertions, 1 deletions
diff --git a/Lib/crypt.py b/Lib/crypt.py
index 8846602d76..33dbc46bb3 100644
--- a/Lib/crypt.py
+++ b/Lib/crypt.py
@@ -10,6 +10,7 @@ except ModuleNotFoundError:
else:
raise ImportError("The required _crypt module was not built as part of CPython")
+import errno
import string as _string
from random import SystemRandom as _SystemRandom
from collections import namedtuple as _namedtuple
@@ -88,7 +89,14 @@ def _add_method(name, *args, rounds=None):
method = _Method(name, *args)
globals()['METHOD_' + name] = method
salt = mksalt(method, rounds=rounds)
- result = crypt('', salt)
+ result = None
+ try:
+ result = crypt('', salt)
+ except OSError as e:
+ # Not all libc libraries support all encryption methods.
+ if e.errno == errno.EINVAL:
+ return False
+ raise
if result and len(result) == method.total_size:
methods.append(method)
return True
diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-10-05-19-36-16.bpo-38402.EZuzgK.rst b/Misc/NEWS.d/next/Core and Builtins/2019-10-05-19-36-16.bpo-38402.EZuzgK.rst
new file mode 100644
index 0000000000..8331500bf1
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2019-10-05-19-36-16.bpo-38402.EZuzgK.rst
@@ -0,0 +1 @@
+Check the error from the system's underlying ``crypt`` or ``crypt_r``.
diff --git a/Modules/_cryptmodule.c b/Modules/_cryptmodule.c
index 5d03f45f64..00c1f4f698 100644
--- a/Modules/_cryptmodule.c
+++ b/Modules/_cryptmodule.c
@@ -42,6 +42,9 @@ crypt_crypt_impl(PyObject *module, const char *word, const char *salt)
#else
crypt_result = crypt(word, salt);
#endif
+ if (crypt_result == NULL) {
+ return PyErr_SetFromErrno(PyExc_OSError);
+ }
return Py_BuildValue("s", crypt_result);
}