Bug #7547

Dir.mktmpdir('~something') tries to expand a profile directory

Added by Jeremy Stanley over 1 year ago. Updated over 1 year ago.

[ruby-core:50793]
Status:Closed
Priority:Normal
Assignee:-
Category:-
Target version:-
ruby -v:ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-darwin11.4.2] Backport:

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>

Associated revisions

Revision 38348
Added by Nobuyoshi Nakada over 1 year ago

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. [Bug #7547]

History

#1 Updated by David Deryl Downey over 1 year 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?

#2 Updated by Charlie Somerville over 1 year ago

=begin
(({Dir.mktmpdir})) uses (({File.expandpath})) internally, which is responsible for expanding out the ~ to home directories. This behaviour is totally intentional by (({File.expandpath})), but I'm not sure if it was intended by the author of (({Dir.mktmpdir}))
=end

#3 Updated by Akira Tanaka over 1 year ago

2012/12/12 charliesome (Charlie Somerville) charlie@charliesomerville.com:

(({Dir.mktmpdir})) uses (({File.expandpath})) internally, which is responsible for expanding out the ~ to home directories. This behaviour is totally intentional by (({File.expandpath})), 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

#4 Updated by Nobuyoshi Nakada over 1 year 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. [Bug #7547]

Also available in: Atom PDF