Actions
Bug #10146
closedDateTime#jisx0301 returns corrupted string when GC.stress is set to true.
Description
DateTime#jisx0301
returns corrupted string when GC.stress
is set to true.
Sample script to reproduce this issue:
# sample.rb
require("date")
GC.stress = true
p DateTime.parse('2001-02-03T04:05:06.123456789+07:00').jisx0301(9)
This script shows invalid string as follows:
> ruby sample.rb
"\x16T04:05:06.123456789+07:00"
The following string is expected:
"H13.02.03T04:05:06.123456789+07:00"
Cause:
This is caused by unexpected GC.
Some variables in 'ext/date/date_core.c' should be marked with RB_GC_GUARD
to prevent GC.
For example, variable 's' in dt_lite_jisx0301 should be marked with RB_GC_GUARD
so that the object pointed by 's' is kept while rb_str_append
is called.
static VALUE
dt_lite_jisx0301(int argc, VALUE *argv, VALUE self)
{
VALUE n, s;
/* ...snip... */
{
get_d1(self);
s = jisx0301_date(m_real_local_jd(dat),
m_real_year(dat));
return rb_str_append(strftimev(RSTRING_PTR(s), self, set_tmx),
iso8601_timediv(self, n));
}
}
should be
static VALUE
dt_lite_jisx0301(int argc, VALUE *argv, VALUE self)
{
VALUE n, s, result;
/* ...snip... */
{
get_d1(self);
s = jisx0301_date(m_real_local_jd(dat),
m_real_year(dat));
result = rb_str_append(strftimev(RSTRING_PTR(s), self, set_tmx),
iso8601_timediv(self, n));
RB_GC_GUARD(s);
return result;
}
}
I attached a patch, date_core.c.diff, which also includes other fixes regarding RB_GC_GUARD
in date_core.c.
If this patch is not so appropriate, please ignore it.
Regards,
Murase
Files
Updated by nobu (Nobuyoshi Nakada) about 10 years ago
- Description updated (diff)
- Category set to ext
- Status changed from Open to Assigned
- Assignee set to tadf (tadayoshi funaba)
- Target version set to 2.2.0
- Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN to 2.0.0: REQUIRED, 2.1: REQUIRED
LGTM
Updated by jeremyevans0 (Jeremy Evans) about 5 years ago
- Status changed from Assigned to Closed
Actions
Like0
Like0Like0Like0