New submission from Ben Darnell:

ssl.SSLError is a subclass of OSError but uses error codes that come from a 
different scope than the standard errno constants and may have conflicts. For 
example, on my system (OSX), ssl.SSL_ERROR_WANT_X509_LOOKUP and errno.EINTR 
have the same value. This would cause problems for code like the following:

  def f():
    while True:
      try:
        return ssl_sock.read()
      except OSError as e:
        if e.errno == errno.EINTR:
          continue
        raise

This function would loop endlessly on ssl.SSL_ERROR_WANT_X509_LOOKUP. (Note 
that I have not run into any problem like this in practice so this is not a 
severe issue; I just stumbled across the possibility). The EINTR case is moot 
now that Python itself retries on EINTR, but other conflicts are possible (the 
problem is also mitigated by the fact that most of the interesting errnos now 
have dedicated exception subtypes)

To use OSError.errno correctly, it is currently necessary to check the exact 
type of the exception; it is not enough to do subclass matching as is usual for 
exceptions. To remedy this, I propose either changing the numeric constants in 
the SSL module (if these are not required to match constants defined in 
openssl), or adding an attribute to OSError like 'errno_scope' to be used when 
interpreting the errno field.

----------
messages: 237239
nosy: Ben.Darnell
priority: normal
severity: normal
status: open
title: Errno conflicts in ssl.SSLError
type: behavior

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue23588>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to