Skip to content

Commit

Permalink
Fix PLATFORM_GET_INC
Browse files Browse the repository at this point in the history
On platforms where unaligned word access is not allowed, and if
`sizeof(val)` and `sizeof(type)` differ:

- `val` > `type`, `val` will be a garbage.
- `val` < `type`, outside `val` will be clobbered.
  • Loading branch information
nobu committed Apr 16, 2023
1 parent 29e01c6 commit fac814c
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 2 deletions.
2 changes: 1 addition & 1 deletion regexec.c
Expand Up @@ -3464,7 +3464,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end,
if (ischanged && msa->enable_cache_match_opt) {
RelAddrType rel;
OnigUChar *addr;
int mem;
MemNumType mem;
UChar* tmp = p;
switch (*tmp++) {
case OP_JUMP:
Expand Down
9 changes: 8 additions & 1 deletion regint.h
Expand Up @@ -319,17 +319,24 @@ RUBY_SYMBOL_EXPORT_BEGIN

#define ONIG_LAST_CODE_POINT (~((OnigCodePoint )0))

#define PLATFORM_GET_INC_ARGUMENTS_ASSERT(val, type) \
((void)sizeof(char[2 * (sizeof(val) == sizeof(type)) - 1]))

#ifdef PLATFORM_UNALIGNED_WORD_ACCESS

# define PLATFORM_GET_INC(val,p,type) do{\
PLATFORM_GET_INC_ARGUMENTS_ASSERT(val, type);\
val = *(type* )p;\
(p) += sizeof(type);\
} while(0)

#else

# define PLATFORM_GET_INC(val,p,type) do{\
xmemcpy(&val, (p), sizeof(type));\
PLATFORM_GET_INC_ARGUMENTS_ASSERT(val, type);\
type platform_get_value;\
xmemcpy(&platform_get_value, (p), sizeof(type));\
val = platform_get_value;\
(p) += sizeof(type);\
} while(0)

Expand Down

0 comments on commit fac814c

Please sign in to comment.