[#41531] [Bug #3385] ext/dbm: accept various version of db — Takahiro Kambe <redmine@...>
Bug #3385: ext/dbm: accept various version of db
2010年6月3日23:38 Takahiro Kambe <redmine@ruby-lang.org>:
2011年11月12日8:14 Tanaka Akira <akr@fsij.org>:
[#41536] RUBY_DEBUG=gc_stress [FATAL] failed to allocate memory — Tanaka Akira <akr@...>
コンパイル時に RUBY_DEBUG_ENV というマクロを定義しておくと、
[#41543] [Bug #3398] 1.9.2 SEGV during test-all — Yuki Sonoda <redmine@...>
Bug #3398: 1.9.2 SEGV during test-all
[#41597] [Bug #3433] Error that occurs by BasicSocket#sendmsg — Masaya Tarui <redmine@...>
Bug #3433: Error that occurs by BasicSocket#sendmsg
[#41600] 質問・提案:cgi.rbの後継となるライブラリについて — Dice <tetradice@...>
Diceです。cgi.rbの後継ライブラリについて質問させてください。
藤岡です。
かくたにです。
藤岡さん、かくたにさん、返信ありがとうございます。
藤岡です。
Diceです。藤岡さん、返信ありがとうございます。
[#41610] [Bug #3443] requireが遅くなる — Yusuke Endoh <redmine@...>
Bug #3443: requireが遅くなる
[#41623] [Feature:trunk] argument delegation — Nobuyoshi Nakada <nobu@...>
なかだです。
遠藤です。
まつもと ゆきひろです
前田です。
[#41672] [Bug #3463] 1.9.2-preview3 で [BUG] gc_sweep(): unknown data type 0x0 — Tomoyuki Chikanaga <redmine@...>
チケット #3463 が更新されました。 (by Tomoyuki Chikanaga)
[#41674] [Bug #3464] win32ole failure load TYPELIB on mswin64 vista — sakiyama shin <redmine@...>
Bug #3464: win32ole failure load TYPELIB on mswin64 vista
[#41702] WIN32OLE_METHOD offset_vtbl — kuwamoto shintaro <beuniv@...>
こんばんわ
助田です。
こんにちは、なかむら(う)です。
助田です。
artonです。
2010/6/24 arton <artonx@yahoo.co.jp>:
[#41705] [Bug #3471][Rejected] ./miniruby sample/test.rbで1NotOK — Shyouhei Urabe <redmine@...>
チケット #3471 が更新されました。 (by Shyouhei Urabe)
2010年6月24日16:53 Shyouhei Urabe <redmine@ruby-lang.org>:
[#41711] [Bug #3473] make clear-installed-list — Usaku NAKAMURA <redmine@...>
Bug #3473: make clear-installed-list
[#41730] (ruby/tk) ruby_1_9_2 への backport — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
[#41752] [Bug #3490][Assigned] test_pack_utf8 failure on mswin64 — Yusuke Endoh <redmine@...>
チケット #3490 が更新されました。 (by Yusuke Endoh)
[#41760] Hash[] の引数が Array の場合の振る舞い — とみたまさひろ <tommy@...>
とみたです。
[ruby-dev:41697] [Bug #3463] 1.9.2-preview3 で [BUG] gc_sweep(): unknown data type 0x0
チケット #3463 が更新されました。 (by Yusuke Endoh)
担当者 Nobuyoshi Nakadaにセット
遠藤です。
redmine がなかださんのメールを拾い落としているので、記録のために
パッチのあるとこだけ貼っておきます。
で、再現コードがないので確認はできないのですが、#2386 もこれでは
ないかと思いました。
marshal_dump + GC っぽいところが似ているような。
近永さん GJ です。
-----
なかだです。
At Wed, 23 Jun 2010 09:27:11 +0900,
Tomoyuki Chikanaga wrote in [ruby-dev:41677]:
> > finaliser_at_exitの時点では、新しいオブジェクトが割り当てられる
> > ことは考えなくてもいいんじゃないかと思いますが。
> clear_dump_arg に arg->str の flags が 0 で来てた時は、下のような
> コールスタックでした。普通にメソッド呼び出しの間に遅延された
> free 関数の呼び出しが挟み込まれているようです。
うっかりしてました。
> ところで、単に興味から訊いてみたいのですが、なぜこのように
> T_DATA型オブジェクトの解放は遅延されてるんでしょう。
> GC での停止時間を分散させるためでしょうか?
dfree関数の呼び出し中にオブジェクトの割り当てをする拡張ライブラ
リがあったので、mark phaseと分離したんでした。
ついでに、TAINTEDとUNTRUSTEDをひとまとめに扱うようにしてみました。
これでどうでしょう。
diff --git a/marshal.c b/marshal.c
index fa91afa..3263a57 100644
--- a/marshal.c
+++ b/marshal.c
@@ -131,14 +131,16 @@ rb_marshal_define_compat(VALUE newclass, VALUE oldclass, VALUE (*dumper)(VALUE),
st_insert(compat_allocator_tbl, (st_data_t)allocator, (st_data_t)compat);
}
+#define MARSHAL_INFECTION (FL_TAINT|FL_UNTRUSTED)
+typedef char ruby_check_marshal_viral_flags[MARSHAL_INFECTION == (int)MARSHAL_INFECTION ? 1 : -1];
+
struct dump_arg {
VALUE str, dest;
st_table *symbols;
st_table *data;
- int taint;
- int untrust;
st_table *compat_tbl;
st_table *encodings;
+ int infection;
};
struct dump_call_arg {
@@ -224,9 +226,8 @@ w_nbyte(const char *s, long n, struct dump_arg *arg)
{
VALUE buf = arg->str;
rb_str_buf_cat(buf, s, n);
+ RBASIC(buf)->flags |= arg->infection;
if (arg->dest && RSTRING_LEN(buf) >= BUFSIZ) {
- if (arg->taint) OBJ_TAINT(buf);
- if (arg->untrust) OBJ_UNTRUST(buf);
rb_io_write(arg->dest, buf);
rb_str_resize(buf, 0);
}
@@ -636,8 +637,7 @@ w_object(VALUE obj, struct dump_arg *arg, int limit)
w_symbol(SYM2ID(obj), arg);
}
else {
- if (OBJ_TAINTED(obj)) arg->taint = TRUE;
- if (OBJ_UNTRUSTED(obj)) arg->untrust = TRUE;
+ arg->infection |= FL_TEST(obj, MARSHAL_INFECTION);
if (rb_respond_to(obj, s_mdump)) {
volatile VALUE v;
@@ -856,12 +856,6 @@ clear_dump_arg(struct dump_arg *arg)
st_free_table(arg->encodings);
arg->encodings = 0;
}
- if (arg->taint) {
- OBJ_TAINT(arg->str);
- }
- if (arg->untrust) {
- OBJ_UNTRUST(arg->str);
- }
}
/*
@@ -922,8 +916,7 @@ marshal_dump(int argc, VALUE *argv)
arg->dest = 0;
arg->symbols = st_init_numtable();
arg->data = st_init_numtable();
- arg->taint = FALSE;
- arg->untrust = FALSE;
+ arg->infection = 0;
arg->compat_tbl = st_init_numtable();
arg->encodings = 0;
arg->str = rb_str_buf_new(0);
@@ -962,9 +955,8 @@ struct load_arg {
st_table *symbols;
st_table *data;
VALUE proc;
- int taint;
- int untrust;
st_table *compat_tbl;
+ int infection;
};
static void
@@ -1118,8 +1110,7 @@ r_bytes0(long len, struct load_arg *arg)
if (NIL_P(str)) goto too_short;
StringValue(str);
if (RSTRING_LEN(str) != len) goto too_short;
- if (OBJ_TAINTED(str)) arg->taint = TRUE;
- if (OBJ_UNTRUSTED(str)) arg->untrust = TRUE;
+ arg->infection |= FL_TEST(str, MARSHAL_INFECTION);
}
return str;
}
@@ -1220,15 +1211,10 @@ r_entry0(VALUE v, st_index_t num, struct load_arg *arg)
else {
st_insert(arg->data, num, (st_data_t)v);
}
- if (arg->taint) {
- OBJ_TAINT(v);
- if ((VALUE)real_obj != Qundef)
- OBJ_TAINT((VALUE)real_obj);
- }
- if (arg->untrust) {
- OBJ_UNTRUST(v);
- if ((VALUE)real_obj != Qundef)
- OBJ_UNTRUST((VALUE)real_obj);
+ if (arg->infection) {
+ FL_SET(v, arg->infection);
+ if ((VALUE)real_obj != Qundef)
+ FL_SET((VALUE)real_obj, arg->infection);
}
return v;
}
@@ -1765,7 +1751,7 @@ static VALUE
marshal_load(int argc, VALUE *argv)
{
VALUE port, proc;
- int major, minor, taint = FALSE;
+ int major, minor, infection = 0;
VALUE v;
volatile VALUE wrapper;
struct load_arg *arg;
@@ -1773,21 +1759,20 @@ marshal_load(int argc, VALUE *argv)
rb_scan_args(argc, argv, "11", &port, &proc);
v = rb_check_string_type(port);
if (!NIL_P(v)) {
- taint = OBJ_TAINTED(port); /* original taintedness */
+ infection = FL_TEST(port, MARSHAL_INFECTION); /* original taintedness */
port = v;
}
else if (rb_respond_to(port, s_getbyte) && rb_respond_to(port, s_read)) {
if (rb_respond_to(port, s_binmode)) {
rb_funcall2(port, s_binmode, 0, 0);
}
- taint = TRUE;
+ infection = FL_TAINT | FL_TEST(port, FL_UNTRUSTED);;
}
else {
rb_raise(rb_eTypeError, "instance of IO needed");
}
wrapper = TypedData_Make_Struct(rb_cData, struct load_arg, &load_arg_data, arg);
- arg->taint = taint;
- arg->untrust = OBJ_UNTRUSTED(port);
+ arg->infection = infection;
arg->src = port;
arg->offset = 0;
arg->symbols = st_init_numtable();
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦
----------------------------------------
http://redmine.ruby-lang.org/issues/show/3463
----------------------------------------
http://redmine.ruby-lang.org