Browse code

add recovery mode to 7z ansi

aCaB authored on 2010/04/01 01:08:01
Showing 2 changed files
... ...
@@ -1,3 +1,7 @@
1
+Wed Mar 31 18:07:05 CEST 2010 (acab)
2
+------------------------------------
3
+  * libclamav/7z: add recovery mode to 7z ansi
4
+
1 5
 Tue Jan 17 11:15:57 CET 2012 (acab)
2 6
 -----------------------------------
3 7
  * misc: performance improvement for HP-UX PA-RISC - patch from 
... ...
@@ -1241,8 +1241,33 @@ static SRes SzArEx_Open2(
1241 1241
 
1242 1242
   p->startPosAfterHeader = startArcPos + k7zStartHeaderSize;
1243 1243
   
1244
+/* aCaB - 2010-02-16 - RECOVERY MODE  
1244 1245
   if (CrcCalc(header + 12, 20) != GetUi32(header + 8))
1245
-    return SZ_ERROR_CRC;
1246
+    return SZ_ERROR_CRC; */
1247
+  if(!GetUi32(header + 8) && !nextHeaderOffset && !nextHeaderSize && !nextHeaderCRC) {
1248
+    int i, checkSize = 500;
1249
+    Byte buf[500];
1250
+    Int64 curpos=0, endpos=0, readpos;
1251
+    RINOK(inStream->Seek(inStream, &curpos, SZ_SEEK_CUR));
1252
+    RINOK(inStream->Seek(inStream, &endpos, SZ_SEEK_END));
1253
+    if(endpos-curpos < 500) checkSize = endpos-curpos;
1254
+    readpos = endpos - checkSize;
1255
+    RINOK(inStream->Seek(inStream, &readpos, SZ_SEEK_SET));
1256
+    RINOK(LookInStream_Read2(inStream, buf, checkSize, SZ_ERROR_ARCHIVE));
1257
+    for (i = (int)checkSize - 2; i >= 0; i--)
1258
+      if((buf[i] == 0x17 && buf[i + 1] == 0x6) || (buf[i] == 0x01 && buf[i + 1] == 0x04))
1259
+	break;
1260
+    if (i < 0)
1261
+      return SZ_ERROR_ARCHIVE;
1262
+    nextHeaderSize = checkSize - i;
1263
+    nextHeaderOffset = readpos + i;
1264
+    if(nextHeaderOffset < k7zStartHeaderSize)
1265
+      return SZ_ERROR_INPUT_EOF;
1266
+    nextHeaderOffset -= k7zStartHeaderSize;
1267
+    nextHeaderCRC = CrcCalc(buf + i, (size_t)nextHeaderSize);
1268
+    RINOK(inStream->Seek(inStream, &curpos, SZ_SEEK_SET));
1269
+  }
1270
+/* aCaB - 2010-02-16 - END OF RECOVERY MODE */
1246 1271
 
1247 1272
   nextHeaderSizeT = (size_t)nextHeaderSize;
1248 1273
   if (nextHeaderSizeT != nextHeaderSize)