Avoid misaligned memory access

This commit is contained in:
smallmodel 2024-10-15 23:18:14 +02:00
parent 53c09b5342
commit 2b6fc0602a
No known key found for this signature in database
GPG key ID: 9F2D623CEDF08512

View file

@ -584,6 +584,7 @@ LABEL_19:
int cLZ77::Decompress( unsigned char *in, size_t in_len, unsigned char *out, size_t *out_len ) int cLZ77::Decompress( unsigned char *in, size_t in_len, unsigned char *out, size_t *out_len )
{ {
unsigned int t; unsigned int t;
unsigned short s;
this->ip_end = &in[in_len]; this->ip_end = &in[in_len];
*out_len = 0; *out_len = 0;
@ -615,7 +616,7 @@ LABEL_5:
} }
t += 15 + *this->ip++; t += 15 + *this->ip++;
} }
*(unsigned int*)this->op = *(unsigned int*)this->ip; memcpy(this->op, this->ip, sizeof(unsigned int));
this->op += 4; this->op += 4;
this->ip += 4; this->ip += 4;
if (--t) if (--t)
@ -632,7 +633,7 @@ LABEL_5:
{ {
do do
{ {
*(unsigned int*)this->op = *(unsigned int*)this->ip; memcpy(this->op, this->ip, sizeof(unsigned int));
this->op += 4; this->op += 4;
this->ip += 4; this->ip += 4;
t -= 4; t -= 4;
@ -686,7 +687,8 @@ LABEL_5:
t += 31 + *this->ip++; t += 31 + *this->ip++;
} }
this->m_pos = this->op - 1; this->m_pos = this->op - 1;
this->m_pos -= LittleUnsignedShort(*(unsigned short*)this->ip) >> 2; CopyLittleShort(&s, this->ip);
this->m_pos -= s >> 2;
this->ip += 2; this->ip += 2;
goto LABEL_42; goto LABEL_42;
} }
@ -712,7 +714,8 @@ LABEL_5:
} }
t += 7 + *this->ip++; t += 7 + *this->ip++;
} }
this->m_pos -= LittleUnsignedShort(*(unsigned short*)this->ip) >> 2; CopyLittleShort(&s, this->ip);
this->m_pos -= s >> 2;
this->ip += 2; this->ip += 2;
if (this->m_pos == this->op) if (this->m_pos == this->op)
break; break;
@ -731,13 +734,13 @@ LABEL_5:
} }
else else
{ {
*(unsigned int*)this->op = *(unsigned int*)this->m_pos; memcpy(this->op, this->m_pos, sizeof(unsigned int));
this->op += 4; this->op += 4;
this->m_pos += 4; this->m_pos += 4;
t -= 2; t -= 2;
do do
{ {
*(unsigned int*)this->op = *(unsigned int*)this->m_pos; memcpy(this->op, this->m_pos, sizeof(unsigned int));
this->op += 4; this->op += 4;
this->m_pos += 4; this->m_pos += 4;
t -= 4; t -= 4;