Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve same directory detection in FileUtils #1425

Conversation

presidentbeef
Copy link
Contributor

FileUtils.cp_r does not detect copying a directory to itself if either the source or destination contains a dot (.). Depending on order and platform, this can cause different errors like File name too long or unknown file type or just stack overflow.

This patch changes the current dynamic regex approach to comparing absolute paths.

The test commands in the Travis CI config did not show test failure for me, but make test-all TESTOPTS="-q -- test/fileutils/test_fileutils.rb" with the new tests but without the changes to descendant_directory? shows the failure clearly.

Example of not detecting same directory:

Click for example

2.3.1 :001 > require 'fileutils'
 => true 
2.3.1 :002 > FileUtils.cp_r 'test_rec', './test_rec'
Errno::ENAMETOOLONG: File name too long @ dir_s_mkdir - ./test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec/test_rec
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1366:in `mkdir'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1366:in `copy'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:472:in `block in copy_entry'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1498:in `wrap_traverse'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1501:in `block in wrap_traverse'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1500:in `each'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1500:in `wrap_traverse'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1501:in `block in wrap_traverse'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1500:in `each'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1500:in `wrap_traverse'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1501:in `block in wrap_traverse'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1500:in `each'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1500:in `wrap_traverse'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1501:in `block in wrap_traverse'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1500:in `each'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1500:in `wrap_traverse'
... 1339 levels...
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1500:in `each'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1500:in `wrap_traverse'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1501:in `block in wrap_traverse'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1500:in `each'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1500:in `wrap_traverse'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1501:in `block in wrap_traverse'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1500:in `each'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1500:in `wrap_traverse'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:469:in `copy_entry'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:444:in `block in cp_r'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1571:in `block in fu_each_src_dest'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1585:in `fu_each_src_dest0'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:1569:in `fu_each_src_dest'
    from /home/justin/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/fileutils.rb:443:in `cp_r'
    from (irb):2
    from /home/justin/.rvm/rubies/ruby-2.3.1/bin/irb:11:in `<main>'

matzbot pushed a commit that referenced this pull request Oct 21, 2017
….local" address.

  #1425

  Patch by @elct9620 [fix GH-1484]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60275 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
mrkn pushed a commit to mrkn/ruby that referenced this pull request Dec 1, 2017
….local" address.

  ruby#1425

  Patch by @elct9620 [fix rubyGH-1484]

git-svn-id: svn+ssh://svn.ruby-lang.org/ruby/trunk@60275 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
@matzbot matzbot closed this in 4f1a00a Aug 6, 2019
hsbt pushed a commit to ruby/fileutils that referenced this pull request Aug 6, 2019
hsbt added a commit to ruby/resolv that referenced this pull request May 22, 2020
….local" address.

  ruby/ruby#1425

  Patch by @elct9620 [fix GH-1484]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60275 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

1 participant