New submission from Serhiy Storchaka <storchaka+cpyt...@gmail.com>:

The frequency rate is saved as a 80-bit floating point value in AIFC files. 
There are issues with reading large values.

1. Values with maximal exponent are read as aifc._HUGE_VAL which is less then 
sys.float_info.max. Thus greater values can be read as lesser values.

>>> aifc._read_float(io.BytesIO(b'\x7f\xff\xff\xff\xff\xff\xff\xff\xf8\x00'))
1.79769313486231e+308
>>> aifc._read_float(io.BytesIO(b'\x43\xfe\xff\xff\xff\xff\xff\xff\xf8\x00'))
1.7976931348623157e+308
>>> aifc._read_float(io.BytesIO(b'\x43\xfe\xff\xff\xff\xff\xff\xff\xff\xff'))
inf

2. If exponent is not maximal, but large enough, this cause an OverflowError. 
It would be better consistently return the maximal value or inf.

>>> aifc._read_float(io.BytesIO(b'\x44\xfe\xff\xff\xff\xff\xff\xff\xf8\x00'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/serhiy/py/cpython3.7/Lib/aifc.py", line 198, in _read_float
    f = (himant * 0x100000000 + lomant) * pow(2.0, expon - 63)
OverflowError: (34, 'Numerical result out of range')

OverflowError when read a broken aifc file can be unexpected.

The proposed PR tries to make reading floats more consistent. I'm not sure it 
is correct.

----------
components: Library (Lib)
messages: 313098
nosy: mark.dickinson, serhiy.storchaka, tim.peters
priority: normal
severity: normal
status: open
title: Issues with reading large float values in AIFC files
type: behavior
versions: Python 2.7, Python 3.6, Python 3.7, Python 3.8

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

Reply via email to