Add checks to calls of file.read() and file.seek() to make sure that
exceptions caused by these calls are caught. They usually occur because of
corrupt PAR2 files.
Signed-off-by: Ira W. Snyder <devel@irasnyder.com>
file = open(full_filename, 'rb')
except:
print 'Could not open %s' % (full_filename, )
file = open(full_filename, 'rb')
except:
print 'Could not open %s' % (full_filename, )
- return []
-
- # We always want to do crc checks
- docrcchecks = True
+ raise EnvironmentError, (errno.EINVAL, 'can not open par2 file')
pkt_header_fmt = '< 8s Q 16s 16s 16s'
pkt_header_size = struct.calcsize(pkt_header_fmt)
pkt_header_fmt = '< 8s Q 16s 16s 16s'
pkt_header_size = struct.calcsize(pkt_header_fmt)
- d = file.read(pkt_header_size)
+ try:
+ d = file.read(pkt_header_size)
+ except OverflowError:
+ raise EnvironmentError, (errno.EINVAL, 'bad par2 file')
if not d:
break
magic, pkt_len, pkt_md5, set_id, pkt_type = struct.unpack(pkt_header_fmt, d)
if not d:
break
magic, pkt_len, pkt_md5, set_id, pkt_type = struct.unpack(pkt_header_fmt, d)
- if docrcchecks:
- import md5
- control_md5 = md5.new()
- control_md5.update(d[0x20:])
- d = file.read(pkt_len - pkt_header_size)
- control_md5.update(d)
-
- if control_md5.digest() != pkt_md5:
- raise EnvironmentError, (errno.EINVAL, \
- "corrupt par2 file - bad packet hash")
-
if pkt_type == 'PAR 2.0\0FileDesc':
if pkt_type == 'PAR 2.0\0FileDesc':
- if not docrcchecks:
- d = file.read(pkt_len - pkt_header_size)
-
file_id, file_md5, file_md5_16k, file_size = \
struct.unpack(file_pkt_fmt, d[:file_pkt_size])
file_id, file_md5, file_md5_16k, file_size = \
struct.unpack(file_pkt_fmt, d[:file_pkt_size])
filenames.append(filename)
elif pkt_type == "PAR 2.0\0Main\0\0\0\0":
filenames.append(filename)
elif pkt_type == "PAR 2.0\0Main\0\0\0\0":
d = file.read(pkt_len - pkt_header_size)
d = file.read(pkt_len - pkt_header_size)
+ except OverflowError:
+ raise EnvironmentError, (errno.EINVAL, 'corrupt par2 file')
if expected_file_ids is None:
expected_file_ids = []
if expected_file_ids is None:
expected_file_ids = []
expected_file_ids.append(d[i:i+16])
else:
expected_file_ids.append(d[i:i+16])
else:
file.seek(pkt_len - pkt_header_size, 1)
file.seek(pkt_len - pkt_header_size, 1)
+ except OverflowError, IOError:
+ raise EnvironmentError, (errno.EINVAL, 'corrupt par2 file')
if expected_file_ids is None:
raise EnvironmentError, (errno.EINVAL, \
if expected_file_ids is None:
raise EnvironmentError, (errno.EINVAL, \