archive_le32enc(&rar->cstate.filtered_buf[offset], value);
}
-static void circular_memcpy(uint8_t* dst, uint8_t* window, const int mask,
+static void circular_memcpy(uint8_t* dst, uint8_t* window, const uint64_t mask,
int64_t start, int64_t end)
{
if((start & mask) > (end & mask)) {
const uint32_t file_size = 0x1000000;
ssize_t i;
- const int mask = (int)rar->cstate.window_mask;
circular_memcpy(rar->cstate.filtered_buf,
rar->cstate.window_buf,
- mask,
+ rar->cstate.window_mask,
rar->cstate.solid_offset + flt->block_start,
rar->cstate.solid_offset + flt->block_start + flt->block_length);
for(i = 0; i < flt->block_length - 4;) {
uint8_t b = rar->cstate.window_buf[(rar->cstate.solid_offset +
- flt->block_start + i++) & mask];
+ flt->block_start + i++) & rar->cstate.window_mask];
/* 0xE8 = x86's call <relative_addr_uint32> (function call)
* 0xE9 = x86's jmp <relative_addr_uint32> (unconditional jump) */
static int run_arm_filter(struct rar5* rar, struct filter_info* flt) {
ssize_t i = 0;
uint32_t offset;
- const int mask = (int)rar->cstate.window_mask;
circular_memcpy(rar->cstate.filtered_buf,
rar->cstate.window_buf,
- mask,
+ rar->cstate.window_mask,
rar->cstate.solid_offset + flt->block_start,
rar->cstate.solid_offset + flt->block_start + flt->block_length);
for(i = 0; i < flt->block_length - 3; i += 4) {
uint8_t* b = &rar->cstate.window_buf[(rar->cstate.solid_offset +
- flt->block_start + i) & mask];
+ flt->block_start + i) & rar->cstate.window_mask];
if(b[3] == 0xEB) {
/* 0xEB = ARM's BL (branch + link) instruction. */
offset = read_filter_data(rar, (rar->cstate.solid_offset +
- flt->block_start + i) & mask) & 0x00ffffff;
+ flt->block_start + i) & rar->cstate.window_mask) & 0x00ffffff;
offset -= (uint32_t) ((i + flt->block_start) / 4);
offset = (offset & 0x00ffffff) | 0xeb000000;
static void push_data(struct archive_read* a, struct rar5* rar,
const uint8_t* buf, int64_t idx_begin, int64_t idx_end)
{
- const int wmask = (int)rar->cstate.window_mask;
+ const uint64_t wmask = rar->cstate.window_mask;
const ssize_t solid_write_ptr = (rar->cstate.solid_offset +
rar->cstate.last_write_ptr) & wmask;
static int copy_string(struct archive_read* a, int len, int dist) {
struct rar5* rar = get_context(a);
- const int cmask = (int)rar->cstate.window_mask;
- const int64_t write_ptr = rar->cstate.write_ptr + rar->cstate.solid_offset;
+ const uint64_t cmask = rar->cstate.window_mask;
+ const uint64_t write_ptr = rar->cstate.write_ptr + rar->cstate.solid_offset;
int i;
/* The unpacker spends most of the time in this function. It would be
uint16_t num;
int ret;
- const int cmask = (int)rar->cstate.window_mask;
+ const uint64_t cmask = rar->cstate.window_mask;
const struct compressed_block_header* hdr = &rar->last_block_hdr;
const uint8_t bit_size = 1 + bf_bit_size(hdr);