Merge pull request #541 from public/fix-466

Handle multiple errors on the stack
This commit is contained in:
Alex Gaynor 2014-02-01 09:40:28 -08:00
commit e4ec95d87d
2 changed files with 45 additions and 17 deletions

View file

@ -182,12 +182,20 @@ class Backend(object):
if not code and isinstance(mode, GCM):
raise InvalidTag
assert code != 0
# consume any remaining errors on the stack
ignored_code = None
while ignored_code != 0:
ignored_code = self._lib.ERR_get_error()
# raise the first error we found
return self._handle_error_code(code)
def _handle_error_code(self, code):
lib = self._lib.ERR_GET_LIB(code)
func = self._lib.ERR_GET_FUNC(code)
reason = self._lib.ERR_GET_REASON(code)
return self._handle_error_code(lib, func, reason)
def _handle_error_code(self, lib, func, reason):
if lib == self._lib.ERR_LIB_EVP:
if func == self._lib.EVP_F_EVP_ENCRYPTFINAL_EX:
if reason == self._lib.EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH:

View file

@ -77,24 +77,44 @@ class TestOpenSSL(object):
def test_handle_unknown_error(self):
with pytest.raises(InternalError):
backend._handle_error_code(0, 0, 0)
backend._handle_error_code(0)
backend._lib.ERR_put_error(backend._lib.ERR_LIB_EVP, 0, 0,
b"test_openssl.py", -1)
with pytest.raises(InternalError):
backend._handle_error(None)
backend._lib.ERR_put_error(
backend._lib.ERR_LIB_EVP,
backend._lib.EVP_F_EVP_ENCRYPTFINAL_EX,
0,
b"test_openssl.py",
-1
)
with pytest.raises(InternalError):
backend._handle_error(None)
backend._lib.ERR_put_error(
backend._lib.ERR_LIB_EVP,
backend._lib.EVP_F_EVP_DECRYPTFINAL_EX,
0,
b"test_openssl.py",
-1
)
with pytest.raises(InternalError):
backend._handle_error(None)
def test_handle_multiple_errors(self):
for i in range(10):
backend._lib.ERR_put_error(backend._lib.ERR_LIB_EVP, 0, 0,
b"test_openssl.py", -1)
assert backend._lib.ERR_peek_error() != 0
with pytest.raises(InternalError):
backend._handle_error_code(backend._lib.ERR_LIB_EVP, 0, 0)
backend._handle_error(None)
with pytest.raises(InternalError):
backend._handle_error_code(
backend._lib.ERR_LIB_EVP,
backend._lib.EVP_F_EVP_ENCRYPTFINAL_EX,
0
)
with pytest.raises(InternalError):
backend._handle_error_code(
backend._lib.ERR_LIB_EVP,
backend._lib.EVP_F_EVP_DECRYPTFINAL_EX,
0
)
assert backend._lib.ERR_peek_error() == 0
def test_ssl_ciphers_registered(self):
meth = backend._lib.TLSv1_method()