* file.c (rb_get_path_check_convert): refine the error message
  when the path name contains null byte.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57336 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2017-01-16 02:43:55 +00:00
Родитель 992b0148ca
Коммит 803621f6d7
3 изменённых файлов: 32 добавлений и 6 удалений

4
file.c
Просмотреть файл

@ -195,7 +195,9 @@ rb_get_path_check_convert(VALUE obj, VALUE tmp, int level)
}
check_path_encoding(tmp);
StringValueCStr(tmp);
if (!rb_str_to_cstr(tmp)) {
rb_raise(rb_eArgError, "path name contains null byte");
}
return rb_str_new4(tmp);
}

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

@ -1475,6 +1475,7 @@ VALUE rb_enc_str_scrub(rb_encoding *enc, VALUE str, VALUE repl);
size_t rb_str_memsize(VALUE);
VALUE rb_sym_proc_call(ID mid, int argc, const VALUE *argv, VALUE passed_proc);
VALUE rb_sym_to_proc(VALUE sym);
char *rb_str_to_cstr(VALUE str);
/* symbol.c */
#ifdef RUBY_ENCODING_H

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

@ -2081,23 +2081,24 @@ rb_str_change_terminator_length(VALUE str, const int oldtermlen, const int terml
return;
}
char *
rb_string_value_cstr(volatile VALUE *ptr)
static char *
str_null_check(VALUE str, int *w)
{
VALUE str = rb_string_value(ptr);
char *s = RSTRING_PTR(str);
long len = RSTRING_LEN(str);
rb_encoding *enc = rb_enc_get(str);
const int minlen = rb_enc_mbminlen(enc);
if (minlen > 1) {
*w = 1;
if (str_null_char(s, len, minlen, enc)) {
rb_raise(rb_eArgError, "string contains null char");
return NULL;
}
return str_fill_term(str, s, len, minlen);
}
*w = 0;
if (!s || memchr(s, 0, len)) {
rb_raise(rb_eArgError, "string contains null byte");
return NULL;
}
if (s[len]) {
s = str_fill_term(str, s, len, minlen);
@ -2105,6 +2106,28 @@ rb_string_value_cstr(volatile VALUE *ptr)
return s;
}
char *
rb_str_to_cstr(VALUE str)
{
int w;
return str_null_check(str, &w);
}
char *
rb_string_value_cstr(volatile VALUE *ptr)
{
VALUE str = rb_string_value(ptr);
int w;
char *s = str_null_check(str, &w);
if (!s) {
if (w) {
rb_raise(rb_eArgError, "string contains null char");
}
rb_raise(rb_eArgError, "string contains null byte");
}
return s;
}
char *
rb_str_fill_terminator(VALUE str, const int newminlen)
{