Skip to content

Commit aaedbde

Browse files
committed
Mark zend_jit_patch memory accesses as unaligned
This prevents ubsan from complaining.
1 parent eb04cb5 commit aaedbde

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3082,18 +3082,21 @@ mrm:
30823082
}
30833083
}
30843084

3085+
typedef ZEND_SET_ALIGNED(1, uint16_t unaligned_uint16_t);
3086+
typedef ZEND_SET_ALIGNED(1, int32_t unaligned_int32_t);
3087+
30853088
static int zend_jit_patch(const void *code, size_t size, const void *from_addr, const void *to_addr)
30863089
{
30873090
int ret = 0;
30883091
uint8_t *p = (uint8_t*)code;
30893092
uint8_t *end = p + size - 5;
30903093

30913094
while (p < end) {
3092-
if ((*(uint16_t*)p & 0xf0ff) == 0x800f && p + *(int32_t*)(p+2) == (uint8_t*)from_addr - 6) {
3093-
*(int32_t*)(p+2) = ((uint8_t*)to_addr - (p + 6));
3095+
if ((*(unaligned_uint16_t*)p & 0xf0ff) == 0x800f && p + *(unaligned_int32_t*)(p+2) == (uint8_t*)from_addr - 6) {
3096+
*(unaligned_int32_t*)(p+2) = ((uint8_t*)to_addr - (p + 6));
30943097
ret++;
3095-
} else if (*p == 0xe9 && p + *(int32_t*)(p+1) == (uint8_t*)from_addr - 5) {
3096-
*(int32_t*)(p+1) = ((uint8_t*)to_addr - (p + 5));
3098+
} else if (*p == 0xe9 && p + *(unaligned_int32_t*)(p+1) == (uint8_t*)from_addr - 5) {
3099+
*(unaligned_int32_t*)(p+1) = ((uint8_t*)to_addr - (p + 5));
30973100
ret++;
30983101
}
30993102
p += _asm_x86_inslen(p);

0 commit comments

Comments
 (0)