Project

General

Profile

Actions

Bug #6144

closed

regexec may allocate extra memory?

Added by mame (Yusuke Endoh) about 12 years ago. Updated about 12 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 2.0.0dev (2012-03-14 trunk 35017) [i686-linux]
Backport:
[ruby-dev:45360]

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

Updated by naruse (Yui NARUSE) about 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) about 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) about 12 years ago

ただ、なぜわざわざ一度 char* 型の変数に代入しているのかはよく分かりません。
あ、stk_alloc の計算のために char* 型でなければならないのを見落としていました。

Updated by k_takata (Ken Takata) about 12 years ago

sizeof(char*)をsizeof(OnigStackIndex)に修正しました。

https://github.com/k-takata/Onigmo/tree/tmp/ruby-2.0.x

Updated by naruse (Yui NARUSE) about 12 years ago

  • Status changed from Assigned to Closed
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0