[PAR2PARSER] Add extra corrupt file checks
[rarslave2.git] / par2parser.py
index 0b0de70..804848f 100644 (file)
@@ -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, \