summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-09-30 08:35:23 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-09-30 08:35:23 +0000
commit1852b4a8660ee8e71997f81cee4903c6eb23f306 (patch)
tree651e33765db8a4d18ab102ea1ef38fc6f5deafc2 /ext
parentd00c9d7e0609f6d9b6141e1dde6fa9321de70b85 (diff)
ext: check if null byte is contained
[ruby-dev:50267] [Bug #13953] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60071 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/bigdecimal/bigdecimal.c13
-rw-r--r--ext/etc/etc.c10
-rw-r--r--ext/gdbm/gdbm.c2
-rw-r--r--ext/nkf/nkf.c9
-rw-r--r--ext/psych/psych_emitter.c4
-rw-r--r--ext/readline/readline.c3
-rw-r--r--ext/syslog/syslog.c6
7 files changed, 25 insertions, 22 deletions
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index d6bc8bdaa7..e9e6af7784 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -289,8 +289,9 @@ again:
#ifdef ENABLE_NUMERIC_STRING
case T_STRING:
- SafeStringValue(v);
- return VpCreateRbObject(strlen(RSTRING_PTR(v)) + VpBaseFig() + 1,
+ StringValueCStr(v);
+ rb_check_safe_obj(v);
+ return VpCreateRbObject(RSTRING_LEN(v) + VpBaseFig() + 1,
RSTRING_PTR(v));
#endif /* ENABLE_NUMERIC_STRING */
@@ -430,8 +431,8 @@ BigDecimal_load(VALUE self, VALUE str)
unsigned char ch;
unsigned long m=0;
- SafeStringValue(str);
- pch = (unsigned char *)RSTRING_PTR(str);
+ pch = (unsigned char *)StringValueCStr(str);
+ rb_check_safe_obj(str);
/* First get max prec */
while((*pch) != (unsigned char)'\0' && (ch = *pch++) != (unsigned char)':') {
if(!ISDIGIT(ch)) {
@@ -2037,8 +2038,8 @@ BigDecimal_to_s(int argc, VALUE *argv, VALUE self)
if (rb_scan_args(argc, argv, "01", &f) == 1) {
if (RB_TYPE_P(f, T_STRING)) {
- SafeStringValue(f);
- psz = RSTRING_PTR(f);
+ psz = StringValueCStr(f);
+ rb_check_safe_obj(f);
if (*psz == ' ') {
fPlus = 1;
psz++;
diff --git a/ext/etc/etc.c b/ext/etc/etc.c
index 5d964ba518..46857c62c7 100644
--- a/ext/etc/etc.c
+++ b/ext/etc/etc.c
@@ -215,9 +215,10 @@ etc_getpwnam(VALUE obj, VALUE nam)
{
#ifdef HAVE_GETPWENT
struct passwd *pwd;
+ const char *p = StringValueCStr(nam);
- SafeStringValue(nam);
- pwd = getpwnam(RSTRING_PTR(nam));
+ rb_check_safe_obj(nam);
+ pwd = getpwnam(p);
if (pwd == 0) rb_raise(rb_eArgError, "can't find user for %"PRIsVALUE, nam);
return setup_passwd(pwd);
#else
@@ -458,9 +459,10 @@ etc_getgrnam(VALUE obj, VALUE nam)
{
#ifdef HAVE_GETGRENT
struct group *grp;
+ const char *p = StringValueCStr(nam);
- SafeStringValue(nam);
- grp = getgrnam(RSTRING_PTR(nam));
+ rb_check_safe_obj(nam);
+ grp = getgrnam(p);
if (grp == 0) rb_raise(rb_eArgError, "can't find group for %"PRIsVALUE, nam);
return setup_group(grp);
#else
diff --git a/ext/gdbm/gdbm.c b/ext/gdbm/gdbm.c
index 709f466cd8..cbf96c29f9 100644
--- a/ext/gdbm/gdbm.c
+++ b/ext/gdbm/gdbm.c
@@ -228,7 +228,7 @@ fgdbm_initialize(int argc, VALUE *argv, VALUE obj)
if (!NIL_P(vflags))
flags = NUM2INT(vflags);
- SafeStringValue(file);
+ FilePathValue(file);
#ifdef GDBM_CLOEXEC
/* GDBM_CLOEXEC is available since gdbm 1.10. */
diff --git a/ext/nkf/nkf.c b/ext/nkf/nkf.c
index 9613a925ce..c958c91753 100644
--- a/ext/nkf/nkf.c
+++ b/ext/nkf/nkf.c
@@ -137,8 +137,7 @@ rb_nkf_convert(VALUE obj, VALUE opt, VALUE src)
{
VALUE tmp;
reinit();
- StringValue(opt);
- nkf_split_options(RSTRING_PTR(opt));
+ nkf_split_options(StringValueCStr(opt));
if (!output_encoding) rb_raise(rb_eArgError, "no output encoding given");
switch (nkf_enc_to_index(output_encoding)) {
@@ -153,8 +152,7 @@ rb_nkf_convert(VALUE obj, VALUE opt, VALUE src)
incsize = INCSIZE;
input_ctr = 0;
- StringValue(src);
- input = (unsigned char *)RSTRING_PTR(src);
+ input = (unsigned char *)StringValuePtr(src);
i_len = RSTRING_LENINT(src);
tmp = rb_str_new(0, i_len*3 + 10);
@@ -195,8 +193,7 @@ rb_nkf_guess(VALUE obj, VALUE src)
reinit();
input_ctr = 0;
- StringValue(src);
- input = (unsigned char *)RSTRING_PTR(src);
+ input = (unsigned char *)StringValuePtr(src);
i_len = RSTRING_LENINT(src);
guess_f = TRUE;
diff --git a/ext/psych/psych_emitter.c b/ext/psych/psych_emitter.c
index 2154470781..bb4c4b226b 100644
--- a/ext/psych/psych_emitter.c
+++ b/ext/psych/psych_emitter.c
@@ -192,8 +192,8 @@ static VALUE start_document(VALUE self, VALUE version, VALUE tags, VALUE imp)
name = rb_str_export_to_enc(name, encoding);
value = rb_str_export_to_enc(value, encoding);
- tail->handle = (yaml_char_t *)RSTRING_PTR(name);
- tail->prefix = (yaml_char_t *)RSTRING_PTR(value);
+ tail->handle = (yaml_char_t *)StringValueCStr(name);
+ tail->prefix = (yaml_char_t *)StringValueCStr(value);
tail++;
}
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index 253798f9e6..5b52422563 100644
--- a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -92,7 +92,8 @@ static char **readline_attempted_completion_function(const char *text,
int start, int end);
#define OutputStringValue(str) do {\
- SafeStringValue(str);\
+ StringValueCStr(str);\
+ rb_check_safe_obj(str);\
(str) = rb_str_conv_enc((str), rb_enc_get(str), rb_locale_encoding());\
} while (0)\
diff --git a/ext/syslog/syslog.c b/ext/syslog/syslog.c
index 5351b28fe6..317607eeef 100644
--- a/ext/syslog/syslog.c
+++ b/ext/syslog/syslog.c
@@ -150,6 +150,7 @@ static VALUE mSyslog_close(VALUE self)
static VALUE mSyslog_open(int argc, VALUE *argv, VALUE self)
{
VALUE ident, opt, fac;
+ const char *ident_ptr;
if (syslog_opened) {
rb_raise(rb_eRuntimeError, "syslog already open");
@@ -160,8 +161,9 @@ static VALUE mSyslog_open(int argc, VALUE *argv, VALUE self)
if (NIL_P(ident)) {
ident = rb_gv_get("$0");
}
- SafeStringValue(ident);
- syslog_ident = strdup(RSTRING_PTR(ident));
+ ident_ptr = StringValueCStr(ident);
+ rb_check_safe_obj(ident);
+ syslog_ident = strdup(ident_ptr);
if (NIL_P(opt)) {
syslog_options = LOG_PID | LOG_CONS;