From d86009d360a7e748d20b9f028bd0f1bfdb2c46cd Mon Sep 17 00:00:00 2001 From: Reece Dunham Date: Sat, 18 Apr 2026 20:46:29 -0400 Subject: [PATCH 1/2] Fix build on Ruby master Taint macros were fully removed --- ext/syck/rubyext.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c index 73e5f98..9ba51f7 100644 --- a/ext/syck/rubyext.c +++ b/ext/syck/rubyext.c @@ -75,7 +75,9 @@ void rb_syck_err_handler _((SyckParser *, const char *)); SyckNode * rb_syck_bad_anchor_handler _((SyckParser *, char *)); void rb_syck_output_handler _((SyckEmitter *, char *, long)); void rb_syck_emitter_handler _((SyckEmitter *, st_data_t)); +#if defined(OBJ_TAINTED) && defined(OBJ_TAINT) int syck_parser_assign_io _((SyckParser *, VALUE *)); +#endif VALUE syck_scalar_alloc _((VALUE class)); VALUE syck_seq_alloc _((VALUE class)); VALUE syck_map_alloc _((VALUE class)); @@ -84,7 +86,9 @@ struct parser_xtra { VALUE data; /* Borrowed this idea from marshal.c to fix [ruby-core:8067] problem */ VALUE proc; VALUE resolver; +#if defined(OBJ_TAINTED) && defined(OBJ_TAINT) int taint; +#endif }; struct emitter_xtra { @@ -100,21 +104,22 @@ VALUE rb_syck_compile(VALUE self, VALUE port) { SYMID oid; - int taint; char *ret; VALUE bc; bytestring_t *sav = NULL; void *data = NULL; SyckParser *parser = syck_new_parser(); - taint = syck_parser_assign_io(parser, &port); +#if defined(OBJ_TAINTED) && defined(OBJ_TAINT) + int taint = syck_parser_assign_io(parser, &port); +#endif syck_parser_handler( parser, syck_yaml2byte_handler ); syck_parser_error_handler( parser, NULL ); syck_parser_implicit_typing( parser, 0 ); syck_parser_taguri_expansion( parser, 0 ); oid = syck_parse( parser ); if (!syck_lookup_sym( parser, oid, &data )) { - rb_raise(rb_eSyntaxError, "root node <%p> not found", (void *)oid); + rb_raise(rb_eSyntaxError, "root node <%p> not found", (void *)oid); } sav = data; @@ -126,7 +131,10 @@ rb_syck_compile(VALUE self, VALUE port) syck_free_parser( parser ); bc = rb_str_new2( ret ); + +#if defined(OBJ_TAINTED) && defined(OBJ_TAINT) if ( taint ) OBJ_TAINT( bc ); +#endif return bc; } @@ -162,6 +170,7 @@ rb_syck_io_str_read( char *buf, SyckIoStr *str, long max_size, long skip ) return len; } +#if defined(OBJ_TAINTED) && defined(OBJ_TAINT) /* * determine: are we reading from a string or io? * (returns tainted? boolean) @@ -188,6 +197,7 @@ syck_parser_assign_io(SyckParser *parser, VALUE *pport) *pport = port; return taint; } +#endif /* * Get value in hash by key, forcing an empty hash if nil. @@ -667,7 +677,9 @@ rb_syck_load_handler(SyckParser *p, SyckNode *n) obj = n->id; } +#if defined(OBJ_TAINTED) && defined(OBJ_TAINT) if ( bonus->taint) OBJ_TAINT( obj ); +#endif if ( bonus->proc != 0 ) rb_funcall(bonus->proc, s_call, 1, obj); rb_hash_aset(bonus->data, INT2FIX(RHASH_SIZE(bonus->data)), obj); @@ -864,7 +876,9 @@ syck_parser_load(int argc, VALUE *argv, VALUE self) syck_set_model( self, input, model ); bonus = (struct parser_xtra *)parser->bonus; +#if defined(OBJ_TAINTED) && defined(OBJ_TAINT) bonus->taint = syck_parser_assign_io(parser, &port); +#endif bonus->data = rb_hash_new(); bonus->resolver = rb_attr_get( self, s_resolver ); if ( NIL_P( proc ) ) bonus->proc = 0; @@ -891,7 +905,9 @@ syck_parser_load_documents(int argc, VALUE *argv, VALUE self) syck_set_model( self, input, model ); bonus = (struct parser_xtra *)parser->bonus; +#if defined(OBJ_TAINTED) && defined(OBJ_TAINT) bonus->taint = syck_parser_assign_io(parser, &port); +#endif bonus->resolver = rb_attr_get( self, s_resolver ); bonus->proc = 0; From fce3cbacd4887e094d84d2ae8bf204a97cee0049 Mon Sep 17 00:00:00 2001 From: Reece Dunham Date: Sat, 18 Apr 2026 20:56:29 -0400 Subject: [PATCH 2/2] Avoid segfault on ruby 4.1.0-dev Still need to initialize the parser! --- ext/syck/rubyext.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c index 9ba51f7..d601eee 100644 --- a/ext/syck/rubyext.c +++ b/ext/syck/rubyext.c @@ -75,9 +75,7 @@ void rb_syck_err_handler _((SyckParser *, const char *)); SyckNode * rb_syck_bad_anchor_handler _((SyckParser *, char *)); void rb_syck_output_handler _((SyckEmitter *, char *, long)); void rb_syck_emitter_handler _((SyckEmitter *, st_data_t)); -#if defined(OBJ_TAINTED) && defined(OBJ_TAINT) int syck_parser_assign_io _((SyckParser *, VALUE *)); -#endif VALUE syck_scalar_alloc _((VALUE class)); VALUE syck_seq_alloc _((VALUE class)); VALUE syck_map_alloc _((VALUE class)); @@ -112,6 +110,8 @@ rb_syck_compile(VALUE self, VALUE port) SyckParser *parser = syck_new_parser(); #if defined(OBJ_TAINTED) && defined(OBJ_TAINT) int taint = syck_parser_assign_io(parser, &port); +#else + syck_parser_assign_io(parser, &port); #endif syck_parser_handler( parser, syck_yaml2byte_handler ); syck_parser_error_handler( parser, NULL ); @@ -170,7 +170,6 @@ rb_syck_io_str_read( char *buf, SyckIoStr *str, long max_size, long skip ) return len; } -#if defined(OBJ_TAINTED) && defined(OBJ_TAINT) /* * determine: are we reading from a string or io? * (returns tainted? boolean) @@ -181,7 +180,9 @@ syck_parser_assign_io(SyckParser *parser, VALUE *pport) int taint = Qtrue; VALUE tmp, port = *pport; if (!NIL_P(tmp = rb_check_string_type(port))) { +#if defined(OBJ_TAINTED) && defined(OBJ_TAINT) taint = OBJ_TAINTED(port); /* original taintedness */ +#endif port = tmp; syck_parser_str( parser, RSTRING_PTR(port), RSTRING_LEN(port), NULL ); } @@ -197,7 +198,6 @@ syck_parser_assign_io(SyckParser *parser, VALUE *pport) *pport = port; return taint; } -#endif /* * Get value in hash by key, forcing an empty hash if nil. @@ -878,6 +878,8 @@ syck_parser_load(int argc, VALUE *argv, VALUE self) bonus = (struct parser_xtra *)parser->bonus; #if defined(OBJ_TAINTED) && defined(OBJ_TAINT) bonus->taint = syck_parser_assign_io(parser, &port); +#else + syck_parser_assign_io(parser, &port); #endif bonus->data = rb_hash_new(); bonus->resolver = rb_attr_get( self, s_resolver ); @@ -907,6 +909,8 @@ syck_parser_load_documents(int argc, VALUE *argv, VALUE self) bonus = (struct parser_xtra *)parser->bonus; #if defined(OBJ_TAINTED) && defined(OBJ_TAINT) bonus->taint = syck_parser_assign_io(parser, &port); +#else + syck_parser_assign_io(parser, &port); #endif bonus->resolver = rb_attr_get( self, s_resolver ); bonus->proc = 0;