summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-05-20 21:21:39 +0000
committershyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-05-20 21:21:39 +0000
commit793f30e38f990e4f947f72fb73a99ee445a26bab (patch)
tree7e0ac9b9a81490f369976a2a0450c820ace64bfb
parent408b181d2cec08ca3d492ecf2a10208aefd76c57 (diff)
* eval.c (rb_thread_atfork): When a ruby process forks, its random
seed shall be reinitialized to prevent CVE-2003-0900 situation. This bug affects for 1.8 and earlier series, but not for 1.9. fixed [ruby-core:34944]. * io.c (pipe_open): ditto. * random.c (rb_reset_random_seed): ditto. * intern.h (rb_reset_random_seed): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@31655 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog13
-rw-r--r--eval.c1
-rw-r--r--intern.h1
-rw-r--r--io.c1
-rw-r--r--random.c8
5 files changed, 23 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index b22845f95b..9fae94249e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+Sat May 21 05:43:03 2011 URABE Shyouhei <[email protected]>
+
+ * eval.c (rb_thread_atfork): When a ruby process forks, its random
+ seed shall be reinitialized to prevent CVE-2003-0900 situation.
+ This bug affects for 1.8 and earlier series, but not for 1.9.
+ fixed [ruby-core:34944].
+
+ * io.c (pipe_open): ditto.
+
+ * random.c (rb_reset_random_seed): ditto.
+
+ * intern.h (rb_reset_random_seed): ditto.
+
Sun May 15 21:43:09 2011 Akinori MUSHA <[email protected]>
* lib/uri/generic.rb (#route_from_path): Fix a bug where
diff --git a/eval.c b/eval.c
index a54fdce6b9..222a868b53 100644
--- a/eval.c
+++ b/eval.c
@@ -13515,6 +13515,7 @@ rb_thread_atfork()
{
rb_thread_t th;
+ rb_reset_random_seed();
if (rb_thread_alone()) return;
FOREACH_THREAD(th) {
if (th != curr_thread) {
diff --git a/intern.h b/intern.h
index 927cdf2ea2..321fb4cc18 100644
--- a/intern.h
+++ b/intern.h
@@ -392,6 +392,7 @@ VALUE rb_length_by_each _((VALUE));
/* random.c */
unsigned long rb_genrand_int32(void);
double rb_genrand_real(void);
+void rb_reset_random_seed(void);
/* re.c */
int rb_memcmp _((const void*,const void*,long));
int rb_memcicmp _((const void*,const void*,long));
diff --git a/io.c b/io.c
index f7f17c85fb..d40e570860 100644
--- a/io.c
+++ b/io.c
@@ -3274,6 +3274,7 @@ retry:
rb_thread_stop_timer();
switch ((pid = fork())) {
case 0: /* child */
+ rb_thread_atfork();
if (modef & FMODE_READABLE) {
close(pr[0]);
if (pr[1] != 1) {
diff --git a/random.c b/random.c
index 92ef3fcae5..45a94d0563 100644
--- a/random.c
+++ b/random.c
@@ -488,9 +488,15 @@ rb_f_rand(argc, argv, obj)
}
void
-Init_Random()
+rb_reset_random_seed()
{
rand_init(random_seed());
+}
+
+void
+Init_Random()
+{
+ rb_reset_random_seed();
rb_define_global_function("srand", rb_f_srand, -1);
rb_define_global_function("rand", rb_f_rand, -1);
rb_global_variable(&saved_seed);