Project

General

Profile

Actions

Bug #7547

closed

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

Added by jstanley0 (Jeremy Stanley) about 12 years ago. Updated about 12 years ago.

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

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) :

(({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

Actions #4

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]
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0