Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 23 additions & 3 deletions ext/syck/rubyext.c
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,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 {
Expand All @@ -100,21 +102,24 @@ 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);
#else
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;

Expand All @@ -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;
}

Expand Down Expand Up @@ -172,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 );
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -864,7 +876,11 @@ 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);
#else
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;
Expand All @@ -891,7 +907,11 @@ 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);
#else
syck_parser_assign_io(parser, &port);
#endif
bonus->resolver = rb_attr_get( self, s_resolver );
bonus->proc = 0;

Expand Down