Bug #7547
closedDir.mktmpdir('~something') tries to expand a profile directory
Description
A change to Dir.mktmpdir sometime between 1.8.7 and 1.9.3 introduced a bug when the prefix starts with a tilde character ('~'). If you try to use the prefix "~something", then instead of creating a subdirectory under the temporary directory named (e.g.) '~something-12345' (which is what ruby 1.8.7 does), it will try to resolve the profile directory for the (hopefully nonexistent) user 'something-12345'.
This is easy to reproduce in irb:
neodymium:~ jeremy$ irb
irb(main):001:0> require 'tmpdir'
=> true
irb(main):002:0> Dir.mktmpdir('wut')
=> "/var/folders/9z/rqj62zxj60s3c12p2rdqm_3m0000gp/T/wut20121211-7622-1ff0o11"
irb(main):003:0> Dir.mktmpdir('~wut')
ArgumentError: user wut20121211-7622-1m76is9 doesn't exist
from /Users/jeremy/.rbenv/versions/1.9.3-p327/lib/ruby/1.9.1/tmpdir.rb:132:in expand_path' from /Users/jeremy/.rbenv/versions/1.9.3-p327/lib/ruby/1.9.1/tmpdir.rb:132:in
create'
from /Users/jeremy/.rbenv/versions/1.9.3-p327/lib/ruby/1.9.1/tmpdir.rb:80:in mktmpdir' from (irb):3 from /Users/jeremy/.rbenv/versions/1.9.3-p327/bin/irb:12:in
'
irb(main):004:0>
Updated by davidderyldowney (David Deryl Downey) about 12 years ago
~ is an alias in most shells which points at the home directory of the current user. It looks like whats happening is that mktmpdir() is seeing the ~ and trying to resolve it as the alias (which is why its doing the user lookup) but since its lacking the / after the ~ its resolving the passed value 'wut' as part of the username, which as you said, thankfully shouldn't exist and errors as it should.
It seems more like 1.8 was having incorrect behavior by not looking at the ~ as a user profile, or, 1.9 shouldn't be looking at the user profile. One of the two aren't operating correctly, and it would seem that 1.8 should have been paying attention to that.
Other than for ownerships of the file and thus RWX permission checks on the dir|file the file mktmpdir is being asked to create, why is it trying to resolve users in either case?
Updated by Anonymous about 12 years ago
=begin
(({Dir.mktmpdir})) uses (({File.expand_path})) internally, which is responsible for expanding out the ~ to home directories. This behaviour is totally intentional by (({File.expand_path})), but I'm not sure if it was intended by the author of (({Dir.mktmpdir}))
=end
Updated by akr (Akira Tanaka) about 12 years ago
2012/12/12 charliesome (Charlie Somerville) charlie@charliesomerville.com:
(({Dir.mktmpdir})) uses (({File.expand_path})) internally, which is responsible for expanding out the ~ to home directories. This behaviour is totally intentional by (({File.expand_path})), but I'm not sure if it was intended by the author of (({Dir.mktmpdir}))
When I implemented Dir.mktmpdir first, I didn't assume Dir.mktmpdir expands ~.
I think ~ should be expanded by shell as Unix.
Tanaka Akira
Updated by nobu (Nobuyoshi Nakada) about 12 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r38348.
Jeremy, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
tmpdir.rb: not expand tilde
- lib/tmpdir.rb (Dir::Tmpname#create): deal with a prefix name which
starts with tilde as a plain name, not expanding as home directory.
[ruby-core:50793] [Bug #7547]