... | ... |
@@ -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) |