diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-10-12 15:48:06 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-10-12 15:48:06 +0000 |
commit | 1821e9f4dcd21743eabdf188093a9a84de58702f (patch) | |
tree | 9324125c2064eec02b0c2dbb60707b0dd3f39c81 /time.c | |
parent | 5b61288fac008ac493695b45d259e7d48a176a76 (diff) | |
download | ruby-1821e9f4dcd21743eabdf188093a9a84de58702f.tar.gz |
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.c | 8 |
1 files changed, 6 insertions, 2 deletions
@@ -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 |