@@ -47,6 +47,50 @@ def test_world_writable
4747 end
4848 end
4949
50+ def test_world_writable_allowed_by_env
51+ omit "no meaning on this platform" if /mswin|mingw/ =~ RUBY_PLATFORM
52+ Dir . mktmpdir do |tmpdir |
53+ envs = %w[ TMPDIR TMP TEMP ]
54+ oldenv = envs . each_with_object ( { } ) { |v , h | h [ v ] = ENV . delete ( v ) }
55+ old_allow = ENV [ "RUBY_TMPDIR_ALLOW_WORLD_WRITABLE" ]
56+ begin
57+ ENV [ envs [ 0 ] ] = tmpdir
58+ File . chmod ( 0777 , tmpdir )
59+
60+ # Without env var, world-writable without sticky should be rejected
61+ ENV [ "RUBY_TMPDIR_ALLOW_WORLD_WRITABLE" ] = nil
62+ assert_not_equal ( tmpdir , assert_warn ( /world-writable/ ) { Dir . tmpdir } )
63+
64+ # With env var set, world-writable without sticky should be accepted
65+ ENV [ "RUBY_TMPDIR_ALLOW_WORLD_WRITABLE" ] = "1"
66+ assert_equal ( tmpdir , Dir . tmpdir )
67+
68+ # mktmpdir should also work
69+ newdir = Dir . mktmpdir ( "d" , tmpdir ) do |dir |
70+ assert_file . directory? dir
71+ assert_equal ( tmpdir , File . dirname ( dir ) )
72+ dir
73+ end
74+ assert_file . not_exist? ( newdir )
75+
76+ # Other accepted values
77+ %w[ true yes TRUE Yes ] . each do |val |
78+ ENV [ "RUBY_TMPDIR_ALLOW_WORLD_WRITABLE" ] = val
79+ assert_equal ( tmpdir , Dir . tmpdir , "should accept with value #{ val . inspect } " )
80+ end
81+
82+ # Invalid values should not bypass
83+ %w[ 0 false no 2 enabled ] . each do |val |
84+ ENV [ "RUBY_TMPDIR_ALLOW_WORLD_WRITABLE" ] = val
85+ assert_not_equal ( tmpdir , Dir . tmpdir , "should reject with value #{ val . inspect } " )
86+ end
87+ ensure
88+ ENV [ "RUBY_TMPDIR_ALLOW_WORLD_WRITABLE" ] = old_allow
89+ ENV . update ( oldenv )
90+ end
91+ end
92+ end
93+
5094 def test_tmpdir_not_empty_parent
5195 Dir . mktmpdir do |tmpdir |
5296 envs = %w[ TMPDIR TMP TEMP ]
0 commit comments