From: Ira W. Snyder Date: Thu, 28 Dec 2006 03:56:01 +0000 (-0800) Subject: [PAR2PARSER] Add extra corrupt file checks X-Git-Tag: v2.0.0~32 X-Git-Url: https://www.irasnyder.com/gitweb/?p=rarslave2.git;a=commitdiff_plain;h=01029d4b402679b099ca350212aaac28b630a3b8;ds=sidebyside [PAR2PARSER] Add extra corrupt file checks 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 --- diff --git a/par2parser.py b/par2parser.py index 0b0de70..804848f 100644 --- a/par2parser.py +++ b/par2parser.py @@ -27,10 +27,7 @@ def get_protected_files (dir, 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) @@ -44,27 +41,16 @@ def get_protected_files (dir, filename): filenames = [] while 1: - 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 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 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]) @@ -74,8 +60,10 @@ def get_protected_files (dir, filename): filenames.append(filename) elif pkt_type == "PAR 2.0\0Main\0\0\0\0": - if not docrcchecks: + try: 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 = [] @@ -86,8 +74,10 @@ def get_protected_files (dir, filename): expected_file_ids.append(d[i:i+16]) else: - if not docrcchecks: + try: 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, \