From fac814c2dc31afef272b45392a7389ef0bfa3a4f Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Sun, 16 Apr 2023 17:45:27 +0900 Subject: 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. --- regint.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'regint.h') diff --git a/regint.h b/regint.h index 75073e6377..cee766ad6e 100644 --- a/regint.h +++ b/regint.h @@ -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) -- cgit v1.2.3