[#85940] [Ruby trunk Bug#14578] Forking a child process inside of a mutex crashes the ruby interpreter — ben.govero@...
Issue #14578 has been reported by bengovero (Ben Govero).
3 messages
2018/03/05
[#86205] [Ruby trunk Feature#14618] Add display width method to String for CLI — aycabta@...
Issue #14618 has been reported by aycabta (aycabta .).
3 messages
2018/03/19
[#86366] Re: [ruby-cvs:70102] usa:r63008 (trunk): get rid of test error/failure on Windows introduced at r62955 — Eric Wong <normalperson@...>
usa@ruby-lang.org wrote:
3 messages
2018/03/28
[ruby-core:86050] [Ruby trunk Bug#14591] Files with invalid multi-byte characters will cause Find::find() to raise EINVAL exception
From:
grover.jeff@...
Date:
2018-03-08 14:36:41 UTC
List:
ruby-core #86050
Issue #14591 has been reported by jeffgrover (Jeff Grover).
----------------------------------------
Bug #14591: Files with invalid multi-byte characters will cause Find::find() to raise EINVAL exception
https://bugs.ruby-lang.org/issues/14591
* Author: jeffgrover (Jeff Grover)
* Status: Open
* Priority: Normal
* Assignee:
* Target version:
* ruby -v: ruby 2.5.0p0 (2017-12-25 revision 61468) [x64-mingw32]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
This can be easily duplicated by the following simple program. I believe this is mostly going to be a problem for users on Windows, where Unicode filenames are common. The example below was the name of a real file in my Recycle Bin:
First, create the problematic file:
~~~
c:\Users\me>copy con .鐃緒申鐃緒申000100000003f582f1e810a56094d18e
File contents
^Z
1 file(s) copied.
c:\Users\me>dir
Volume in drive C is Windows
Volume Serial Number is 64A1-A9E3
Directory of c:\Users\grove\Documents\Ruby
03/08/2018 07:18 AM <DIR> .
03/08/2018 07:18 AM <DIR> ..
03/08/2018 07:18 AM 15 .鐃緒申鐃緒申000100000003f582f1e810a56094d18e
~~~
Then, run the following simple Ruby program:
require 'find'
~~~
Find.find('.') { |path_name|
puts path_name
}
~~~
You will see the exception raised:
~~~
Traceback (most recent call last):
6: from dirhog.rb:22:in `<main>'
5: from C:/Ruby25-x64/lib/ruby/2.5.0/find.rb:43:in `find'
4: from C:/Ruby25-x64/lib/ruby/2.5.0/find.rb:43:in `each'
3: from C:/Ruby25-x64/lib/ruby/2.5.0/find.rb:48:in `block in find'
2: from C:/Ruby25-x64/lib/ruby/2.5.0/find.rb:48:in `catch'
1: from C:/Ruby25-x64/lib/ruby/2.5.0/find.rb:51:in `block (2 levels) in find'
C:/Ruby25-x64/lib/ruby/2.5.0/find.rb:51:in `lstat': Invalid argument @ rb_file_s_lstat - c:\$Recycle.Bin/S-1-5-21-2582874610-2078213686-3622711573-1001/.????000100000003f582f1e810a56094d18e (Errno::EINVAL)
~~~
The (work-around) solution I came up with was to add to the list of exceptions already handled by "ignore_errors" in lib/find.rb line 52:
~~~
begin
s = File.lstat(file)
rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG, Errno::EINVAL
raise unless ignore_error
next
end
~~~
This seems a reasonable compromise for now, although there is probably a better solution which involves dealing with the invalid characters and translating them to something that can be handled. The reason I am submitting this bug instead of monkey-patching a solution or something is that it is almost impossible to do this externally, you can't catch the exception while in the block of find().
If you want, I can do a GitHub pull request with the change.
As a side note, I'd also like to consider making "ignore_errors=false" the default, instead of true... as it hides problems the programmer might want to know about. If the programmer doesn't care about errors (as in my case) the documentation should clearly emphasize this option.
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>