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
 Wed Mar 31 16:27:18 EEST 2010 (edwin)
2 6
 -------------------------------------
3 7
  * shared/output.c: fix race condition in IDSESSION mode (bb #1838).
... ...
@@ -1125,8 +1125,33 @@ static SRes SzArEx_Open2(
1125 1125
 
1126 1126
   p->startPosAfterHeader = k7zStartHeaderSize;
1127 1127
   
1128
+/* aCaB - 2010-02-16 - RECOVERY MODE  
1128 1129
   if (CrcCalc(header + 12, 20) != GetUi32(header + 8))
1129
-    return SZ_ERROR_CRC;
1130
+    return SZ_ERROR_CRC; */
1131
+  if(!GetUi32(header + 8) && !nextHeaderOffset && !nextHeaderSize && !nextHeaderCRC) {
1132
+    int i, checkSize = 500;
1133
+    Byte buf[500];
1134
+    Int64 curpos=0, endpos=0, readpos;
1135
+    RINOK(inStream->Seek(inStream, &curpos, SZ_SEEK_CUR));
1136
+    RINOK(inStream->Seek(inStream, &endpos, SZ_SEEK_END));
1137
+    if(endpos-curpos < 500) checkSize = endpos-curpos;
1138
+    readpos = endpos - checkSize;
1139
+    RINOK(inStream->Seek(inStream, &readpos, SZ_SEEK_SET));
1140
+    RINOK(LookInStream_Read2(inStream, buf, checkSize, SZ_ERROR_ARCHIVE));
1141
+    for (i = (int)checkSize - 2; i >= 0; i--)
1142
+      if((buf[i] == 0x17 && buf[i + 1] == 0x6) || (buf[i] == 0x01 && buf[i + 1] == 0x04))
1143
+	break;
1144
+    if (i < 0)
1145
+      return SZ_ERROR_ARCHIVE;
1146
+    nextHeaderSize = checkSize - i;
1147
+    nextHeaderOffset = readpos + i;
1148
+    if(nextHeaderOffset < k7zStartHeaderSize)
1149
+      return SZ_ERROR_INPUT_EOF;
1150
+    nextHeaderOffset -= k7zStartHeaderSize;
1151
+    nextHeaderCRC = CrcCalc(buf + i, (size_t)nextHeaderSize);
1152
+    RINOK(inStream->Seek(inStream, &curpos, SZ_SEEK_SET));
1153
+  }
1154
+/* aCaB - 2010-02-16 - END OF RECOVERY MODE */
1130 1155
 
1131 1156
   nextHeaderSizeT = (size_t)nextHeaderSize;
1132 1157
   if (nextHeaderSizeT != nextHeaderSize)