liblzma: Fix uint64_t vs. size_t confusion.
This broke 32-bit builds due to a pointer type mismatch.
This bug was introduced with the output-size-limited encoding
in 625f4c7c99
.
Thanks to huangqinjin for the bug report.
This commit is contained in:
parent
2bd36c91d0
commit
2523c30705
@ -160,9 +160,12 @@ rc_shift_low(lzma_range_encoder *rc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// NOTE: The last two arguments are uint64_t instead of size_t because in
|
||||||
|
// the dummy version these refer to the size of the whole range-encoded
|
||||||
|
// output stream, not just to the currently available output buffer space.
|
||||||
static inline bool
|
static inline bool
|
||||||
rc_shift_low_dummy(uint64_t *low, uint64_t *cache_size, uint8_t *cache,
|
rc_shift_low_dummy(uint64_t *low, uint64_t *cache_size, uint8_t *cache,
|
||||||
size_t *out_pos, size_t out_size)
|
uint64_t *out_pos, uint64_t out_size)
|
||||||
{
|
{
|
||||||
if ((uint32_t)(*low) < (uint32_t)(0xFF000000)
|
if ((uint32_t)(*low) < (uint32_t)(0xFF000000)
|
||||||
|| (uint32_t)(*low >> 32) != 0) {
|
|| (uint32_t)(*low >> 32) != 0) {
|
||||||
@ -262,7 +265,7 @@ rc_encode(lzma_range_encoder *rc,
|
|||||||
|
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
rc_encode_dummy(const lzma_range_encoder *rc, size_t out_size)
|
rc_encode_dummy(const lzma_range_encoder *rc, uint64_t out_limit)
|
||||||
{
|
{
|
||||||
assert(rc->count <= RC_SYMBOLS_MAX);
|
assert(rc->count <= RC_SYMBOLS_MAX);
|
||||||
|
|
||||||
@ -278,7 +281,7 @@ rc_encode_dummy(const lzma_range_encoder *rc, size_t out_size)
|
|||||||
// Normalize
|
// Normalize
|
||||||
if (range < RC_TOP_VALUE) {
|
if (range < RC_TOP_VALUE) {
|
||||||
if (rc_shift_low_dummy(&low, &cache_size, &cache,
|
if (rc_shift_low_dummy(&low, &cache_size, &cache,
|
||||||
&out_pos, out_size))
|
&out_pos, out_limit))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
range <<= RC_SHIFT_BITS;
|
range <<= RC_SHIFT_BITS;
|
||||||
@ -330,7 +333,7 @@ rc_encode_dummy(const lzma_range_encoder *rc, size_t out_size)
|
|||||||
// the flushing that will be done at the end of the stream.
|
// the flushing that will be done at the end of the stream.
|
||||||
for (pos = 0; pos < 5; ++pos) {
|
for (pos = 0; pos < 5; ++pos) {
|
||||||
if (rc_shift_low_dummy(&low, &cache_size,
|
if (rc_shift_low_dummy(&low, &cache_size,
|
||||||
&cache, &out_pos, out_size))
|
&cache, &out_pos, out_limit))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user