string.c: fix rb_external_str_new_with_enc

* string.c (rb_external_str_new_with_enc): do not search non-ascii
  by NULL pointer.  [ruby-core:84055] [Bug #14150]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60979 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2017-12-02 07:09:16 +00:00
Родитель f32bf7e678
Коммит a1692f7fdf
3 изменённых файлов: 36 добавлений и 0 удалений

21
ext/-test-/string/new.c Normal file
Просмотреть файл

@ -0,0 +1,21 @@
#include "ruby.h"
#include "ruby/encoding.h"
VALUE
bug_str_buf_new(VALUE self, VALUE len)
{
return rb_str_buf_new(NUM2LONG(len));
}
VALUE
bug_external_str_new(VALUE self, VALUE len, VALUE enc)
{
return rb_external_str_new_with_enc(NULL, NUM2LONG(len), rb_to_encoding(enc));
}
void
Init_new(VALUE klass)
{
rb_define_singleton_method(klass, "buf_new", bug_str_buf_new, 1);
rb_define_singleton_method(klass, "external_new", bug_external_str_new, 2);
}

Просмотреть файл

@ -1011,6 +1011,10 @@ rb_external_str_new_with_enc(const char *ptr, long len, rb_encoding *eenc)
VALUE str;
const int eidx = rb_enc_to_index(eenc);
if (!ptr) {
return rb_tainted_str_new_with_enc(ptr, len, eenc);
}
/* ASCII-8BIT case, no conversion */
if ((eidx == rb_ascii8bit_encindex()) ||
(eidx == rb_usascii_encindex() && search_nonascii(ptr, ptr + len))) {

Просмотреть файл

@ -0,0 +1,11 @@
# frozen_string_literal: false
require 'test/unit'
require '-test-/string'
class Test_StringExternalNew < Test::Unit::TestCase
def test_external_new_with_enc
Encoding.list.each do |enc|
assert_equal(enc, Bug::String.external_new(0, enc).encoding)
end
end
end