]> www.wagner.pp.ru Git - oss/ctypescrypto.git/blobdiff - ctypescrypto/exception.py
Fix incompatibilities with OpenSSL 1.1.0
[oss/ctypescrypto.git] / ctypescrypto / exception.py
index 30c138e43aa5ba52651243267abe0cdf974244fa..d2866a020c050f4ddf5d5a105b91c60a529f128e 100644 (file)
@@ -1,50 +1,38 @@
 """
 Exception which extracts libcrypto error information
 """
-from ctypes import *
-from ctypescrypto import libcrypto
-strings_loaded=False
+from ctypes import c_ulong, c_char_p, create_string_buffer
+from ctypescrypto import libcrypto, strings_loaded
 
-__all__ = ['LibCryptoError','clear_err_stack']
-
-def _check_null(s):
-       """
-       Handle transparently NULL returned from error reporting functions
-       instead of strings
-       """
-       if s is None:   
-               return ""
-       return s
+__all__ = ['LibCryptoError', 'clear_err_stack']
 
 class LibCryptoError(Exception):
-       """
-               Exception for libcrypto errors. Adds all the info, which can be
-               extracted from internal (per-thread) libcrypto error stack to the message,
-               passed to the constructor.
-       """
-       def __init__(self,msg):
-               global strings_loaded
-               if not strings_loaded:
-                       libcrypto.ERR_load_crypto_strings()
-                       strings_loaded = True
-               e=libcrypto.ERR_get_error()
-               m = msg
-               while e != 0:
-                       m+="\n\t"+_check_null(libcrypto.ERR_lib_error_string(e))+":"+\
-                         _check_null(libcrypto.ERR_func_error_string(e))+":"+\
-                         _check_null(libcrypto.ERR_reason_error_string(e))
-                       e=libcrypto.ERR_get_error()
-               self.args=(m,)
+    """
+    Exception for libcrypto errors. Adds all the info, which can be
+    extracted from internal (per-thread) libcrypto error stack to the message,
+    passed to the constructor.
+    """
+    def __init__(self, msg):
+        global strings_loaded
+        if not strings_loaded:
+            libcrypto.ERR_load_crypto_strings()
+            strings_loaded = True
+        err_code = libcrypto.ERR_get_error()
+        mesg = msg
+        buf = create_string_buffer(128)
+        while err_code != 0:
+            mesg += "\n\t" + libcrypto.ERR_error_string(err_code, buf)
+            err_code = libcrypto.ERR_get_error()
+        super(LibCryptoError, self).__init__(mesg)
 
 def clear_err_stack():
-       """
-         Clears internal libcrypto err stack. Call it if you've checked
-         return code and processed exceptional situation, so subsequent
-         raising of the LibCryptoError wouldn't list already handled errors
-       """
-       libcrypto.ERR_clear_error()
-
+    """
+    Clears internal libcrypto err stack. Call it if you've checked
+    return code and processed exceptional situation, so subsequent
+    raising of the LibCryptoError wouldn't list already handled errors
+    """
+    libcrypto.ERR_clear_error()
 
-libcrypto.ERR_lib_error_string.restype=c_char_p
-libcrypto.ERR_func_error_string.restype=c_char_p
-libcrypto.ERR_reason_error_string.restype=c_char_p
+libcrypto.ERR_get_error.restype = c_ulong
+libcrypto.ERR_error_string.restype = c_char_p
+libcrypto.ERR_error_string.argtypes = (c_ulong, c_char_p)