# \[Bug #3463\] 1.9.2-preview3 $B$G(B \[BUG\] gc\_sweep(): unknown data type 0x0

**URL:** <https://www.ruby-forum.com/t/bug-3463-1-9-2-preview3-b-g-b-bug-gc-sweep-unknown-data-type-0x0/190600>\
**Category:** Development\
**Created:** [June 23, 2010, 3:49pm UTC](https://www.ruby-forum.com/t/bug-3463-1-9-2-preview3-b-g-b-bug-gc-sweep-unknown-data-type-0x0/190600 "2010-06-23T15:49:53Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [June 23, 2010, 3:49pm UTC](https://www.ruby-forum.com/t/bug-3463-1-9-2-preview3-b-g-b-bug-gc-sweep-unknown-data-type-0x0/190600/1 "2010-06-23T15:49:53Z")

</div>

e$B%A%1%C%He(B #3463 e$B$,99?7$5$l$^$7$?!#e(B (by Yusuke E.)

e$BC4Ev\<Te(B Nobuyoshi N.e$B$K%;%C%He(B

e$B1sF#$G$9!#e(B

redmine e$B$,$J$+$@$5$s$N%a!\<%k$r=&$$Mn$H$7$F$$$k$N$G!“5-O?$N$?$a$Ke(B  
e$B%Q%C%A$N$”$k$H$3$@$1E=$C$F$\*$-$^$9!#e(B

e$B$G!":F8=%3!\<%I$,$J$$$N$G3NG’$O$G$-$J$$$N$G$9$,!"e(B#2386  
e$B$b$3$l$G$Oe(B  
e$B$J$$$+$H;W$$$^$7$?!#e(B  
marshal\_dump + GC e$B$C$]$$$H$3$m$,;w$F$$$k$h$&$J!#e(B

e$B6a1J$5$se(B GJ e$B$G$9!#e(B

* * *

e$B$J$+$@$G$9!#e(B

At Wed, 23 Jun 2010 09:27:11 +0900,  
Tomoyuki C. wrote in [ruby-dev:41677]:

> > finaliser\_at\_exite$B$N;~E@$G$O!"?7$7$$%\*%V%8%'%/%H$,3d$jEv$F$i$l$ke(B  
> > e$B$3$H$O9M$($J$/$F$b$$$$$s$8$c$J$$$+$H;W$$$^$9$,!#e(B  
> > clear\_dump\_arg e$B$Ke(B arg-\>str e$B$Ne(B flags e$B$,e(B 0 e$B$GMh$F$?;~$O!"2\<$N$h$&$Je(B  
> > e$B%3!\<%k%9%?%C%/$G$7$?!#IaDL$K%a%=%C%I8F$S=P$7$N4V$KCY1d$5$l$?e(B  
> > free e$B4X?t$N8F$S=P$7$,64$\_9~$^$l$F$$$k$h$&$G$9!#e(B

e$B$&$C$+$j$7$F$^$7$?!#e(B

> e$B$H$3$m$G!"C1$K6=L#$+$i?V$$$F$_$?$$$N$G$9$,!"$J$\<$3$N$h$&$Ke(B  
> T\_DATAe$B7?%\*%V%8%'%/%H$N2rJ|$OCY1d$5$l$F$k$s$G$7$g$&!#e(B  
> GC e$B$G$NDd;_;~4V$rJ,;6$5$;$k$?$a$G$7$g$&$+!)e(B

dfreee$B4X?t$N8F$S=P$7Cf$K%\*%V%8%'%/%H$N3d$jEv$F$r$9$k3HD%%i%$%V%ie(B  
e$B%j$,$"$C$?$N$G!"e(Bmark phasee$B$HJ,N%$7$?$s$G$7$?!#e(B

e$B$D$$$G$K!"e(BTAINTEDe$B$He(BUNTRUSTEDe$B$r$R$H$^$H$a$K07$&$h$&$K$7$F$\_$^$7$?!#e(B  
e$B$3$l$G$I$&$G$7$g$&!#e(B

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 (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();

## – — e$BKM$NA0$Ke(BBuge$B$O$J$$!#e(B — e$BKM$N8e$m$Ke(BBuge$B$O$G$-$k!#e(B e$BCfEDe(B e$B?-1Ye(B

[http://redmine.ruby-lang.org/issues/show/3463](http://redmine.ruby-lang.org/issues/show/3463)
