diff --git a/ChangeLog b/ChangeLog
index 875f4eb754..b1b9e6e76d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Fri Dec 16 11:44:43 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>
+
+	* ext/syck/rubyext.c (syck_resolver_tagurize): fixed memory leak.
+
+	* ext/syck/rubyext.c (syck_node_type_id_set): should set newly
+	  allocated memory instead of RString's internal storage.
+
+	... these fixes won't fix [ruby-dev:27839]. more work is needed.
+
 Thu Dec 15 12:35:14 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>
 
 	* lib/tmpdir.rb: merged RDoc patch from Eric Hodel <drbrain at
@@ -146,7 +155,7 @@ Tue Dec  6 16:48:40 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>
 
 	* gc.c (ruby_xrealloc2): ditto.
 
-Tue Dec  4 16:37:57 2005  Yuya Nishida  <yuya@j96.org>
+Tue Dec  6 16:37:57 2005  Yuya Nishida  <yuya@j96.org>
 
 	* eval.c (exec_under): avoid accessing ruby_frame->prev.
 	  [ruby-dev:27948]
@@ -2988,7 +2997,8 @@ Sat Jul 30 18:49:44 2005  Masaki Suketa  <masaki.suketa@nifty.ne.jp>
 
 	* ext/win32ole/tests/testOLETYPE.rb: ditto.
 
-Fri Jul 29 16:12:02 005	 Keiju Ishitsuka <keiju@ruby-lang.org>
+Fri Jul 29 16:12:02 2005  Keiju Ishitsuka  <keiju@ruby-lang.org>
+
 	* lib/irb/context.rb: fix `irb --readline` option. [ruby-dev:40955]
 
 Fri Jul 29 09:59:38 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>
diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c
index cf183dab52..e45d4971f2 100644
--- a/ext/syck/rubyext.c
+++ b/ext/syck/rubyext.c
@@ -1191,10 +1191,9 @@ syck_resolver_tagurize( self, val )
 
     if ( !NIL_P(tmp) )
     {
-        char *taguri;
-        val = tmp;
-        taguri = syck_type_id_to_uri( RSTRING(val)->ptr );
-        return rb_str_new2( taguri );
+        char *taguri = syck_type_id_to_uri( RSTRING(tmp)->ptr );
+        val = rb_str_new2( taguri );
+        S_FREE( taguri );
     }
 
     return val;
@@ -1405,7 +1404,9 @@ syck_node_mark( n )
             }
         break;
     }
-    rb_gc_mark_maybe( n->shortcut );
+#if 0 /* maybe needed */
+    if ( n->shortcut ) syck_node_mark( n->shortcut ); /* caution: maybe cyclic */
+#endif
 }
 
 /*
@@ -1795,7 +1796,8 @@ syck_node_type_id_set( self, type_id )
     if ( NIL_P( type_id ) ) {
         node->type_id = NULL;
     } else {
-        node->type_id = StringValuePtr( type_id );
+        StringValue( type_id );
+        node->type_id = syck_strndup( RSTRING(type_id)->ptr, RSTRING(type_id)->len );
     }
 
     rb_iv_set( self, "@type_id", type_id );