こんにちは、山本です。

>ruby 1.8.2 (2005-04-27) [i386-cygwin] において、
>YAML.dump が無限ループになる場合に遭遇しました。

調べただけで解決にはなってないのですが、

Index: emitter.c
===================================================================
RCS file: /src/ruby/ext/syck/emitter.c,v
retrieving revision 1.11
diff -u -w -b -p -r1.11 emitter.c
--- emitter.c	6 May 2004 06:29:56 -0000	1.11
+++ emitter.c	8 May 2005 06:19:25 -0000
@@ -383,6 +383,8 @@ syck_emitter_start_obj( SyckEmitter *e, 
                  */
                 idx = e->anchors->num_entries + 1;
 
+                printf("------> %d %d %d\n", idx, n->pos, e->bufpos);
+
                 /*
                  * Create the anchor tag
                  */
                if ( n->pos >= e->bufpos )
                {

とすると、

------> 1 3 0
------> 2 680 0
------> 3 1357 0
------> 4 2034 0
------> 5 2511 0
------> 6 3188 0
------> 7 3865 4094
(略)
------> 7 3865 8148
(略)

となり、Create anchor tag の後の条件文が成り立たなくなっているため、
いつまでたってもアンカーが作られず、無限ループになってしまっています。

e->bufpos が増加していくのは、syck_emitter_flush で e->bufpos += check_room
となっているためです。

思うに、

                    /*
                     * Write the anchor into the buffer
                     */
                    S_MEMMOVE( start + alen, start, char, e->marker - start );
                    S_MEMCPY( start + 1, anchor_name, char, strlen( anchor_name ) );
                    start[0] = '&';
                    start[alen - 1] = ' ';
                    e->marker += alen;

の部分が、そもそもその部分が flush されていると正しく実行できないため、
「固定長バッファ+flush」と「アンカー機能」は互いに矛盾するような気がします。

固定長バッファをやめ、変換結果を全部メモリに格納して、最後に取り出す必要が
あるのではないでしょうか。(とは言っても、このライブラリの開発者 why は外国人なので・・・
一応 ruby-core に振っておきます)