summaryrefslogtreecommitdiff
path: root/marshal.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-07-21 08:45:34 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-07-21 08:45:34 +0000
commitc9accd03e721f1455ccdf3f09f5251d6b93c1b4b (patch)
treee7e9ebbc425d88a42d68c78ac20d10c858318f5c /marshal.c
parent303974887a95ca34448821e16eec339b30d25da6 (diff)
matz
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@843 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'marshal.c')
-rw-r--r--marshal.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/marshal.c b/marshal.c
index af4a9fa6e3..f4342c06b0 100644
--- a/marshal.c
+++ b/marshal.c
@@ -55,6 +55,7 @@ struct dump_arg {
VALUE str;
st_table *symbol;
st_table *data;
+ int taint;
};
struct dump_call_arg {
@@ -270,6 +271,8 @@ w_object(obj, arg, limit)
return;
}
+ if (OBJ_TAINTED(obj)) arg->taint = Qtrue;
+
st_add_direct(arg->data, obj, arg->data->num_entries);
if (rb_respond_to(obj, s_dump)) {
VALUE v;
@@ -432,6 +435,9 @@ dump_ensure(arg)
{
st_free_table(arg->symbol);
st_free_table(arg->data);
+ if (!arg->fp && arg->taint) {
+ OBJ_TAINT(arg->str);
+ }
return 0;
}
@@ -476,6 +482,7 @@ marshal_dump(argc, argv)
arg.symbol = st_init_numtable();
arg.data = st_init_numtable();
+ arg.taint = Qfalse;
c_arg.obj = obj;
c_arg.arg = &arg;
c_arg.limit = limit;
@@ -494,6 +501,7 @@ struct load_arg {
st_table *symbol;
VALUE data;
VALUE proc;
+ int taint;
};
static VALUE r_object _((struct load_arg *arg));
@@ -658,11 +666,11 @@ r_regist(v, arg)
VALUE v;
struct load_arg *arg;
{
- OBJ_TAINT(v);
if (arg->proc) {
rb_funcall(arg->proc, rb_intern("call"), 1, v);
}
rb_hash_aset(arg->data, INT2FIX(RHASH(arg->data)->tbl->num_entries), v);
+ if (arg->taint) OBJ_TAINT(v);
return v;
}
@@ -944,6 +952,7 @@ marshal_load(argc, argv)
GetOpenFile(port, fptr);
rb_io_check_readable(fptr);
arg.fp = fptr->f;
+ arg.taint = Qtrue;
}
else if (rb_respond_to(port, rb_intern("to_str"))) {
int len;
@@ -951,6 +960,7 @@ marshal_load(argc, argv)
arg.fp = 0;
arg.ptr = rb_str2cstr(port, &len);
arg.end = arg.ptr + len;
+ arg.taint = OBJ_TAINTED(port);
}
else {
rb_raise(rb_eTypeError, "instance of IO needed");