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