Zip/Ruby: 読み込めないファイルの件

id:gioextさんから読めないファイルがあるとのことで、調べてみた。


Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7d1eb60 (LWP 16748)]
zipruby_file_read (self=3081164780) at zipruby_file.c:181
181 if (zip_fread(p_file->file, buf, sb.size) == -1) {

static VALUE zipruby_file_read(VALUE self) {
  struct zipruby_file *p_file;
  struct zip_stat sb;
  char *buf;

  Data_Get_Struct(self, struct zipruby_file, p_file);
  Check_File(p_file);

  zip_stat_init(&sb);

  if (zip_stat_index(p_file->archive, p_file->sb->index, 0, &sb)) {
    rb_raise(Error, "Read file failed: %s", zip_strerror(p_file->archive));
  }

  buf = alloca(sb.size);
  
  if (zip_fread(p_file->file, buf, sb.size) == -1) {
    rb_raise(Error, "Read file failed: %s", zip_file_strerror(p_file->file));
  }

  return rb_str_new(buf, sb.size);
}

allocaで大きすぎるメモリを確保しているのが原因かなぁ…。1GBのエントリを読み込んだら落ちたし。
バッファのサイズを小さくしてちまちま読み込むようにしてみよう。
Rubyを介さないで、直接エントリをファイルに書き出すメソッドを必要かも。