diff options
Diffstat (limited to 'C/XzDec.c')
| -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; |
