[ruby/bigdecimal] Alloc wrapper object before VpAlloc

Calling TypedData_Wrap_Struct after VpAlloc may cause memory leak.

This commit reverts d11b78f9c4.

https://github.com/ruby/bigdecimal/commit/2c5a288caf
This commit is contained in:
Kenta Murata 2020-12-29 16:35:25 +09:00
Родитель 13b520d578
Коммит 29d012c964
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: CEFE8AFB6081B062
1 изменённых файлов: 17 добавлений и 10 удалений

Просмотреть файл

@ -2792,12 +2792,14 @@ rb_str_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception)
digs = 0;
const char *c_str = StringValueCStr(val);
VALUE obj = TypedData_Wrap_Struct(rb_cBigDecimal, &BigDecimal_data_type, 0);
Real *vp = VpAlloc(digs, c_str, 1, raise_exception);
if (!vp)
return Qnil;
vp->obj = TypedData_Wrap_Struct(rb_cBigDecimal, &BigDecimal_data_type, vp);
RB_OBJ_FREEZE(vp->obj);
return check_exception(vp->obj);
RTYPEDDATA_DATA(obj) = vp;
vp->obj = obj;
RB_OBJ_FREEZE(obj);
return VpCheckGetValue(vp);
}
static VALUE
@ -2822,10 +2824,13 @@ rb_convert_to_BigDecimal(VALUE val, size_t digs, int raise_exception)
Real *vp;
TypedData_Get_Struct(val, Real, &BigDecimal_data_type, vp);
VALUE copy = TypedData_Wrap_Struct(rb_cBigDecimal, &BigDecimal_data_type, 0);
vp = VpCopy(NULL, vp);
vp->obj = TypedData_Wrap_Struct(rb_cBigDecimal, &BigDecimal_data_type, vp);
RTYPEDDATA_DATA(copy) = vp;
vp->obj = copy;
RB_OBJ_FREEZE(vp->obj);
return check_exception(vp->obj);
return VpCheckGetValue(vp);
}
else if (RB_INTEGER_TYPE_P(val)) {
return rb_inum_convert_to_BigDecimal(val, digs, raise_exception);
@ -2929,14 +2934,16 @@ static VALUE
BigDecimal_s_interpret_loosely(VALUE klass, VALUE str)
{
ENTER(1);
char const *c_str;
Real *pv;
c_str = StringValueCStr(str);
char const *c_str = StringValueCStr(str);
VALUE obj = TypedData_Wrap_Struct(klass, &BigDecimal_data_type, 0);
Real *pv;
GUARD_OBJ(pv, VpAlloc(0, c_str, 0, 1));
pv->obj = TypedData_Wrap_Struct(klass, &BigDecimal_data_type, pv);
RTYPEDDATA_DATA(obj) = pv;
pv->obj = obj;
RB_OBJ_FREEZE(pv->obj);
return pv->obj;
return obj;
}
/* call-seq: