Bug #625
closedrb_io_fread does not work
Description
=begin
遠藤です。
DEPRECATED(int rb_getc(FILE*));
DEPRECATED(long rb_io_fread(char *, long, FILE *));
DEPRECATED(long rb_io_fwrite(const char *, long, FILE ));
DEPRECATED(int rb_read_pending(FILE));
というのが ruby/io.h にありますが、試しにこれらを使ってみた
ところ、インタプリタがフリーズしました。
$ ../ruby -rfoo -e 'foo'
(^C が効かない)
実際、rb_io_fread が io_fread を呼び、READ_DATA_PENDING で
未初期化の rbuf_len を参照していて、まともに動くような感じ
ではないように見えました。
rb_io_fwrite も動いていないような気がします。
README.EXT に記載されていないのであれば、中途半端に残すより
削除してしまったらどうでしょうか。
以下、検証に使ったコードです。
もし使い方が間違っていたらすみません。
#include "ruby.h"
#include "ruby/io.h"
VALUE foo(VALUE self)
{
int i;
char buf[11];
FILE *fp;
fp = fopen("foo", "r+");
i = rb_io_fread(buf, 10, fp);
buf[i] = '\0';
fclose(fp);
printf(""%s"\n", buf);
/*
fp = fopen("bar", "w");
rb_io_fwrite("foobarbaz\n", 10, fp);
fflush(fp);
fclose(fp);
*/
return Qnil;
}
void Init_foo()
{
rb_define_global_function("foo", foo, 0);
}
--
Yusuke ENDOH [email protected]
=end
Updated by mame (Yusuke Endoh) over 16 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
=begin
Applied in changeset r19805.
=end