diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2023-04-16 17:45:27 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2023-04-16 17:45:27 +0900 |
commit | fac814c2dc31afef272b45392a7389ef0bfa3a4f (patch) | |
tree | 403f732183e2a0191ea36042c978cb1e7be2d666 | |
parent | 29e01c6f5f8901bdaab818dfd4699cfa2a86b8e6 (diff) | |
download | ruby-fac814c2dc31afef272b45392a7389ef0bfa3a4f.tar.gz |
Fix `PLATFORM_GET_INC`
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.
-rw-r--r-- | regexec.c | 2 | ||||
-rw-r--r-- | regint.h | 9 |
2 files changed, 9 insertions, 2 deletions
@@ -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: @@ -319,9 +319,13 @@ 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) @@ -329,7 +333,10 @@ RUBY_SYMBOL_EXPORT_BEGIN #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) |