diff options
Diffstat (limited to '')
-rw-r--r-- | C/XzDec.c | 29 |
1 files changed, 14 insertions, 15 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* XzDec.c -- Xz Decode | 1 | /* XzDec.c -- Xz Decode |
2 | 2024-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 | ||
797 | static BoolInt Xz_CheckFooter(CXzStreamFlags flags, UInt64 indexSize, const Byte *buf) | 797 | static 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; |