Bug #6144
closedregexec may allocate extra memory?
Description
naruse さん、k-takata さん
遠藤です。
多分鬼車の問題なんですが、regexec.c に
alloc_addr = (char* )xalloca(sizeof(char*) * (ptr_num));\
という行があります。(#define STACK_INIT 内)
前後見てませんが、
alloc_addr = (char* )xalloca(sizeof(char) * (ptr_num));\
または
alloc_addr = (char** )xalloca(sizeof(char*) * (ptr_num));\
と書きたかったんじゃないでしょうか。
たぶん前者かなーという予感はしますが、確認・修正して頂けます
でしょうか。もし現状が正しかったらすみません。
やはり Coverity Scan さんが見つけてくれてました。
--
Yusuke Endoh mame@tsg.ne.jp
Updated by naruse (Yui NARUSE) over 12 years ago
- Status changed from Open to Assigned
うーん、何か変えるとしたら、以下のような感じですかねぇ。
diff --git a/regexec.c b/regexec.c
index 2587cd9..9e31c71 100644
--- a/regexec.c
+++ b/regexec.c
@@ -446,16 +446,16 @@ onig_region_copy(OnigRegion* to, OnigRegion* from)
#define STACK_INIT(alloc_addr, ptr_num, stack_num) do {
if (msa->stack_p) {\
- alloc_addr = (char* )xalloca(sizeof(char*) * (ptr_num));\
- alloc_addr = (char* )xalloca(sizeof(OnigStackIndex*) * (ptr_num));
stk_alloc = (OnigStackType* )(msa->stack_p);
stk_base = stk_alloc;
stk = stk_base;
stk_end = stk_base + msa->stack_n;
}
else {\
- alloc_addr = (char* )xalloca(sizeof(char*) * (ptr_num)\
- alloc_addr = (char* )xalloca(sizeof(OnigStackIndex*) * (ptr_num)
+ sizeof(OnigStackType) * (stack_num));\
- stk_alloc = (OnigStackType* )(alloc_addr + sizeof(char*) * (ptr_num));\
- stk_alloc = (OnigStackType* )(alloc_addr + sizeof(OnigStackIndex*) * (ptr_num));
stk_base = stk_alloc;
stk = stk_base;
stk_end = stk_base + (stack_num);\
Updated by k_takata (Ken Takata) over 12 years ago
alloc_addr は、その後 OnigStackIndex* にキャストされて、OnigStackIndex の配列として使用されています。
OnigStackIndex は intptr_t の typedef ですので、xalloca で割り当てるサイズは合っています。
ただ、なぜわざわざ一度 char* 型の変数に代入しているのかはよく分かりません。
alloc_addr = (OnigStackIndex* )xalloca(sizeof(OnigStackIndex) * (ptr_num));\
とするのが最も分かりやすい気がしますが…。
Updated by k_takata (Ken Takata) over 12 years ago
ただ、なぜわざわざ一度 char* 型の変数に代入しているのかはよく分かりません。
あ、stk_alloc の計算のために char* 型でなければならないのを見落としていました。
Updated by k_takata (Ken Takata) over 12 years ago
sizeof(char*)をsizeof(OnigStackIndex)に修正しました。
Updated by naruse (Yui NARUSE) over 12 years ago
- Status changed from Assigned to Closed