2012年5月17日 18:21 Tanaka Akira <akr / fsij.org>:

> バッファがあると、読みすぎることがあるのではないでしょうか。
>
> 読みすぎたぶんを捨ててしまうと、
> marshal したデータが複数並んでいるものを読み込む場合に、
> 動作しなくなってしまうと思います。

> 個人的に最近作っている tb というもので、この動作を利用しているので、
> 気になるところです。

気がついたので記録のために書いておきますが、marshal の load が読みすぎないという
性質を process.c でも利用しているようです。

rb_fork_err で、子プロセスの例外を marshal で読み出し、次に errno を読み出し、
エラーメッセージを読み出す、というようなことをやっています。

        if ((read(ep[0], &state, sizeof(state))) == sizeof(state) && state) {
            io = rb_io_fdopen(ep[0], O_RDONLY|O_BINARY, NULL);
            exc = rb_marshal_load(io);
            rb_set_errinfo(exc);
        }
#define READ_FROM_CHILD(ptr, len) \
        (NIL_P(io) ? read(ep[0], (ptr), (len)) : rb_io_bufread(io,
(ptr), (len)))
        if ((size = READ_FROM_CHILD(&err, sizeof(err))) < 0) {
            err = errno;
        }
        if (size == sizeof(err) &&
            errmsg && 0 < errmsg_buflen) {
            ssize_t ret = READ_FROM_CHILD(errmsg, errmsg_buflen-1);
            if (0 <= ret) {
                errmsg[ret] = '\0';
            }
        }

のあたりです。
-- 
[田中 哲][たなか あきら][Tanaka Akira]