aboutsummaryrefslogtreecommitdiff
path: root/C/XzDec.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--C/XzDec.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/C/XzDec.c b/C/XzDec.c
index 3d1c98e..2dac324 100644
--- a/C/XzDec.c
+++ b/C/XzDec.c
@@ -1,5 +1,5 @@
1/* XzDec.c -- Xz Decode 1/* XzDec.c -- Xz Decode
22024-03-01 : Igor Pavlov : Public domain */ 2: Igor Pavlov : Public domain */
3 3
4#include "Precomp.h" 4#include "Precomp.h"
5 5
@@ -59,7 +59,7 @@ unsigned Xz_ReadVarInt(const Byte *p, size_t maxSize, UInt64 *value)
59 59
60 for (i = 0; i < limit;) 60 for (i = 0; i < limit;)
61 { 61 {
62 Byte b = p[i]; 62 const unsigned b = p[i];
63 *value |= (UInt64)(b & 0x7F) << (7 * i++); 63 *value |= (UInt64)(b & 0x7F) << (7 * i++);
64 if ((b & 0x80) == 0) 64 if ((b & 0x80) == 0)
65 return (b == 0 && i != 1) ? 0 : i; 65 return (b == 0 && i != 1) ? 0 : i;
@@ -796,11 +796,10 @@ SRes Xz_ParseHeader(CXzStreamFlags *p, const Byte *buf)
796 796
797static BoolInt Xz_CheckFooter(CXzStreamFlags flags, UInt64 indexSize, const Byte *buf) 797static BoolInt Xz_CheckFooter(CXzStreamFlags flags, UInt64 indexSize, const Byte *buf)
798{ 798{
799 return indexSize == (((UInt64)GetUi32(buf + 4) + 1) << 2) 799 return indexSize == (((UInt64)GetUi32a(buf + 4) + 1) << 2)
800 && GetUi32(buf) == CrcCalc(buf + 4, 6) 800 && GetUi32a(buf) == CrcCalc(buf + 4, 6)
801 && flags == GetBe16(buf + 8) 801 && flags == GetBe16a(buf + 8)
802 && buf[10] == XZ_FOOTER_SIG_0 802 && GetUi16a(buf + 10) == (XZ_FOOTER_SIG_0 | (XZ_FOOTER_SIG_1 << 8));
803 && buf[11] == XZ_FOOTER_SIG_1;
804} 803}
805 804
806#define READ_VARINT_AND_CHECK(buf, pos, size, res) \ 805#define READ_VARINT_AND_CHECK(buf, pos, size, res) \
@@ -1166,7 +1165,7 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen,
1166 p->indexPreSize = 1 + Xz_WriteVarInt(p->buf + 1, p->numBlocks); 1165 p->indexPreSize = 1 + Xz_WriteVarInt(p->buf + 1, p->numBlocks);
1167 p->indexPos = p->indexPreSize; 1166 p->indexPos = p->indexPreSize;
1168 p->indexSize += p->indexPreSize; 1167 p->indexSize += p->indexPreSize;
1169 Sha256_Final(&p->sha, p->shaDigest); 1168 Sha256_Final(&p->sha, (Byte *)(void *)p->shaDigest32);
1170 Sha256_Init(&p->sha); 1169 Sha256_Init(&p->sha);
1171 p->crc = CrcUpdate(CRC_INIT_VAL, p->buf, p->indexPreSize); 1170 p->crc = CrcUpdate(CRC_INIT_VAL, p->buf, p->indexPreSize);
1172 p->state = XZ_STATE_STREAM_INDEX; 1171 p->state = XZ_STATE_STREAM_INDEX;
@@ -1241,10 +1240,10 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen,
1241 break; 1240 break;
1242 } 1241 }
1243 { 1242 {
1244 Byte digest[XZ_CHECK_SIZE_MAX]; 1243 UInt32 digest32[XZ_CHECK_SIZE_MAX / 4];
1245 p->state = XZ_STATE_BLOCK_HEADER; 1244 p->state = XZ_STATE_BLOCK_HEADER;
1246 p->pos = 0; 1245 p->pos = 0;
1247 if (XzCheck_Final(&p->check, digest) && memcmp(digest, p->buf, checkSize) != 0) 1246 if (XzCheck_Final(&p->check, (void *)digest32) && memcmp(digest32, p->buf, checkSize) != 0)
1248 return SZ_ERROR_CRC; 1247 return SZ_ERROR_CRC;
1249 if (p->decodeOnlyOneBlock) 1248 if (p->decodeOnlyOneBlock)
1250 { 1249 {
@@ -1289,12 +1288,12 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen,
1289 } 1288 }
1290 else 1289 else
1291 { 1290 {
1292 Byte digest[SHA256_DIGEST_SIZE]; 1291 UInt32 digest32[SHA256_DIGEST_SIZE / 4];
1293 p->state = XZ_STATE_STREAM_INDEX_CRC; 1292 p->state = XZ_STATE_STREAM_INDEX_CRC;
1294 p->indexSize += 4; 1293 p->indexSize += 4;
1295 p->pos = 0; 1294 p->pos = 0;
1296 Sha256_Final(&p->sha, digest); 1295 Sha256_Final(&p->sha, (void *)digest32);
1297 if (memcmp(digest, p->shaDigest, SHA256_DIGEST_SIZE) != 0) 1296 if (memcmp(digest32, p->shaDigest32, SHA256_DIGEST_SIZE) != 0)
1298 return SZ_ERROR_CRC; 1297 return SZ_ERROR_CRC;
1299 } 1298 }
1300 } 1299 }
@@ -1313,7 +1312,7 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen,
1313 const Byte *ptr = p->buf; 1312 const Byte *ptr = p->buf;
1314 p->state = XZ_STATE_STREAM_FOOTER; 1313 p->state = XZ_STATE_STREAM_FOOTER;
1315 p->pos = 0; 1314 p->pos = 0;
1316 if (CRC_GET_DIGEST(p->crc) != GetUi32(ptr)) 1315 if (CRC_GET_DIGEST(p->crc) != GetUi32a(ptr))
1317 return SZ_ERROR_CRC; 1316 return SZ_ERROR_CRC;
1318 } 1317 }
1319 break; 1318 break;
@@ -1343,7 +1342,7 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen,
1343 { 1342 {
1344 if (*src != 0) 1343 if (*src != 0)
1345 { 1344 {
1346 if (((UInt32)p->padSize & 3) != 0) 1345 if ((unsigned)p->padSize & 3)
1347 return SZ_ERROR_NO_ARCHIVE; 1346 return SZ_ERROR_NO_ARCHIVE;
1348 p->pos = 0; 1347 p->pos = 0;
1349 p->state = XZ_STATE_STREAM_HEADER; 1348 p->state = XZ_STATE_STREAM_HEADER;