diff --git a/ChangeLog b/ChangeLog index 97eed219b7..1b29842750 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sun Jan 18 11:49:46 2015 Masaki Suketa + + * ext/win32ole/win32ole.c (ole_invoke): avoid SEGV when VT_RECORD + variable is passed by reference. [ruby-dev:48803] [Bug #10697] + Sat Jan 17 23:59:15 2015 Nobuyoshi Nakada * ext/psych/lib/psych/visitors/yaml_tree.rb (visit_String): diff --git a/ext/win32ole/win32ole.c b/ext/win32ole/win32ole.c index 582ff32c78..c60564dca0 100644 --- a/ext/win32ole/win32ole.c +++ b/ext/win32ole/win32ole.c @@ -2663,6 +2663,10 @@ ole_invoke(int argc, VALUE *argv, VALUE self, USHORT wFlags, BOOL is_bracket) param = rb_ary_entry(paramS, i-cNamedArgs); if (rb_obj_is_kind_of(param, cWIN32OLE_VARIANT)) { ole_variant2variant(param, &op.dp.rgvarg[n]); + } else if (rb_obj_is_kind_of(param, cWIN32OLE_RECORD)) { + ole_val2variant(param, &realargs[n]); + op.dp.rgvarg[n] = realargs[n]; + V_VT(&op.dp.rgvarg[n]) = VT_RECORD | VT_BYREF; } else { ole_val2variant(param, &realargs[n]); V_VT(&op.dp.rgvarg[n]) = VT_VARIANT | VT_BYREF;