From 650d328b6be41373ce12b17cc1c32f9bb0f4f714 Mon Sep 17 00:00:00 2001 From: matz Date: Tue, 16 May 2006 00:43:41 +0000 Subject: * dir.c (dir_close): should not close untainted dir stream. * dir.c (GetDIR): add tainted/frozen check for each dir operation. git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8@10157 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- dir.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'dir.c') diff --git a/dir.c b/dir.c index 22f68913d..83feef93f 100644 --- a/dir.c +++ b/dir.c @@ -325,7 +325,17 @@ dir_closed() rb_raise(rb_eIOError, "closed directory"); } +static void +dir_check(dir) + VALUE dir; +{ + if (!OBJ_TAINTED(dir) && rb_safe_level() >= 4) + rb_raise(rb_eSecurityError, "Insecure: operation on untainted Dir"); + rb_check_frozen(dir); +} + #define GetDIR(obj, dirp) do {\ + dir_check(dir);\ Data_Get_Struct(obj, struct dir_data, dirp);\ if (dirp->dir == NULL) dir_closed();\ } while (0) @@ -536,6 +546,9 @@ dir_close(dir) { struct dir_data *dirp; + if (rb_safe_level() >= 4 && !OBJ_TAINTED(dir)) { + rb_raise(rb_eSecurityError, "Insecure: can't close"); + } GetDIR(dir, dirp); closedir(dirp->dir); dirp->dir = NULL; -- cgit