Project

General

Profile

Actions

Bug #17626

closed

FileUtils.cp may cause utime_failed

Added by agate-pris (agate pris) about 3 years ago. Updated about 3 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x64-mingw32]
[ruby-dev:51020]

Description

FileUtils.cp will cause utime_failed if the file name contains Japanese characters and preserve is true.

This will probably only happen on Windows. It occures on Windows 10 version 2004 build 21301.1010.

require 'fileutils'

FileUtils.cp('foo', 'foo_copy', preserve: true)
FileUtils.cp('foo', 'fooコピー', preserve: true)
$ ruby test.rb
C:/tools/ruby30/lib/ruby/3.0.0/fileutils.rb:1424:in `utime': No such file or directory @ utime_failed - fooコピー (Errno::ENOENT)
        from C:/tools/ruby30/lib/ruby/3.0.0/fileutils.rb:1424:in `copy_metadata'
        from C:/tools/ruby30/lib/ruby/3.0.0/fileutils.rb:515:in `copy_file'
        from C:/tools/ruby30/lib/ruby/3.0.0/fileutils.rb:433:in `block in cp'
        from C:/tools/ruby30/lib/ruby/3.0.0/fileutils.rb:1597:in `block in fu_each_src_dest'
        from C:/tools/ruby30/lib/ruby/3.0.0/fileutils.rb:1613:in `fu_each_src_dest0'
        from C:/tools/ruby30/lib/ruby/3.0.0/fileutils.rb:1595:in `fu_each_src_dest'
        from C:/tools/ruby30/lib/ruby/3.0.0/fileutils.rb:432:in `cp'
        from test.rb:4:in `<main>'

The expected result is copy to fooコピー is success same like copy to foo_copy.


Files

ruby-w32_utimensat.patch (326 Bytes) ruby-w32_utimensat.patch xtkoba (Tee KOBAYASHI), 02/14/2021 02:19 AM

Updated by xtkoba (Tee KOBAYASHI) about 3 years ago

I compiled the following code by x86_64-w64-mingw32-gcc:

/* -*- coding: utf-8 -*- */
#include <stdio.h>
void touch(char *path) {
  FILE *file = fopen(path, "a");
  if (file != NULL) fclose(file);
}
int main() {
  touch("fooコピー");
  return 0;
}

and when I ran the output executable on Windows 10, I got a file with a funny name:

$ echo -n foo* | hexdump -C
00000000  66 6f 6f c3 a3 e2 80 9a  c2 b3 c3 a3 c6 92 e2 80  |foo.............|
00000010  9d c3 a3 c6 92 c2 bc                              |.......|
00000017

When I ran the following Ruby script in the directory where the funny file exists, then I got no errors:

# -*- coding: utf-8 -*-
File.utime 0, 0, "fooコピー"

I cannot summarize this phenomenon, but I think it has something to do with the main issue.

Updated by xtkoba (Tee KOBAYASHI) about 3 years ago

I have found a solution to this issue. See the attached patch.

BTW I didn't know that special functions must be used to handle non-ASCII filenames with MinGW.

Actions #3

Updated by nobu (Nobuyoshi Nakada) about 3 years ago

  • Backport changed from 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN to 2.5: DONTNEED, 2.6: DONTNEED, 2.7: DONTNEED, 3.0: REQUIRED
Actions #4

Updated by xtkoba (Tee KOBAYASHI) about 3 years ago

  • Status changed from Open to Closed

Applied in changeset git|a681c484a3c5b9235c84bc5c253b4406e498e8cf.


Fixed codepage for utime [Bug #17626]

Should use the given codepage argument.

Co-Authored-By: Nobuyoshi Nakada

Updated by agate-pris (agate pris) about 3 years ago

Thank you very much!

Updated by naruse (Yui NARUSE) about 3 years ago

  • Backport changed from 2.5: DONTNEED, 2.6: DONTNEED, 2.7: DONTNEED, 3.0: REQUIRED to 2.5: DONTNEED, 2.6: DONTNEED, 2.7: DONTNEED, 3.0: DONE

ruby_3_0 551f1236a43ad014522d120dea1f136052879c0a merged revision(s) a681c484a3c5b9235c84bc5c253b4406e498e8cf.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0