From 01029d4b402679b099ca350212aaac28b630a3b8 Mon Sep 17 00:00:00 2001 From: "Ira W. Snyder" Date: Wed, 27 Dec 2006 19:56:01 -0800 Subject: [PATCH] [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 --- par2parser.py | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) 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, \ -- 2.25.1