summaryrefslogtreecommitdiff
path: root/time.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-10-12 15:48:06 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-10-12 15:48:06 +0000
commit1821e9f4dcd21743eabdf188093a9a84de58702f (patch)
tree9324125c2064eec02b0c2dbb60707b0dd3f39c81 /time.c
parent5b61288fac008ac493695b45d259e7d48a176a76 (diff)
Fix overwritten zone string
* time.c (zone_str): while rb_fstring_usascii and the family require that the argument string is never modified, tzname may point areas which will be discarded by calling tzset(). make a String then call rb_fstring to copy the zone name. when an ID equals TZ environment variable, its name string also has modified by changing tzname. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65035 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'time.c')
-rw-r--r--time.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/time.c b/time.c
index 791dc539c9..24c55e1a12 100644
--- a/time.c
+++ b/time.c
@@ -873,6 +873,8 @@ zone_str(const char *zone)
{
const char *p;
int ascii_only = 1;
+ VALUE str;
+ size_t len;
if (zone == NULL) {
return rb_fstring_usascii("(NO-TIMEZONE-ABBREVIATION)");
@@ -883,12 +885,14 @@ zone_str(const char *zone)
ascii_only = 0;
break;
}
+ len = p - zone + strlen(p);
if (ascii_only) {
- return rb_fstring_usascii(zone);
+ str = rb_usascii_str_new(zone, len);
}
else {
- return rb_fstring_enc_cstr(zone, rb_locale_encoding());
+ str = rb_enc_str_new(zone, len, rb_locale_encoding());
}
+ return rb_fstring(str);
}
static void