From a0eb541e52f43bfb3a889b9a6a69f6f37d5b79a0 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Fri, 29 Nov 2024 13:33:34 +0900 Subject: [PATCH] [ruby/psych] Do not depend on the evaluation order of C arguments The evaluation order of C arguments is unspecified. `RSTRING_LEN(value)` would fail if the conversion to a String by `StringValuePtr(value)` is not done yet. Coverity Scan found this issue. https://github.com/ruby/psych/commit/d1e6bf323a --- ext/psych/psych_emitter.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/psych/psych_emitter.c b/ext/psych/psych_emitter.c index 0c5875f343..3b7a367bd7 100644 --- a/ext/psych/psych_emitter.c +++ b/ext/psych/psych_emitter.c @@ -304,11 +304,12 @@ static VALUE scalar( tag = rb_str_export_to_enc(tag, encoding); } + const char *value_ptr = StringValuePtr(value); yaml_scalar_event_initialize( &event, (yaml_char_t *)(NIL_P(anchor) ? NULL : StringValueCStr(anchor)), (yaml_char_t *)(NIL_P(tag) ? NULL : StringValueCStr(tag)), - (yaml_char_t*)StringValuePtr(value), + (yaml_char_t*)value_ptr, (int)RSTRING_LEN(value), plain ? 1 : 0, quoted ? 1 : 0,