Project

General

Profile

Actions

Bug #12520

closed

CIFS raises Errno::EACCES for chown while UID not found in remote system

Added by arton (Akio Tajima) over 8 years ago. Updated over 8 years ago.

Status:
Closed
Target version:
-
[ruby-dev:49687]

Description

FileUtilsを利用した:preserve => truecp_r中に例外となります。(題名が真の原因かは不明。それ以外に思い当たる点がない)
システムはDebian jessieです。

Linux version 3.16.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian 3.16.7-ckt25-2 (2016-04-08)

具体的には以下のようになりました。

/usr/local/lib/ruby/2.3.0/fileutils.rb:1411:in `chown': Permission denied @ chown_internal - /mnt/media/Music2/iTunes/iTunes Music/Jeanette/Porque Te Vas/02 Porqué Te Vas_.m4a (Errno::EACCES)
	from /usr/local/lib/ruby/2.3.0/fileutils.rb:1411:in `copy_metadata'
	from /usr/local/lib/ruby/2.3.0/fileutils.rb:475:in `block in copy_entry'
	from /usr/local/lib/ruby/2.3.0/fileutils.rb:1504:in `wrap_traverse'
	from /usr/local/lib/ruby/2.3.0/fileutils.rb:1501:in `block in wrap_traverse'
	from /usr/local/lib/ruby/2.3.0/fileutils.rb:1500:in `each'
	from /usr/local/lib/ruby/2.3.0/fileutils.rb:1500:in `wrap_traverse'
	from /usr/local/lib/ruby/2.3.0/fileutils.rb:1501:in `block in wrap_traverse'
	from /usr/local/lib/ruby/2.3.0/fileutils.rb:1500:in `each'
	from /usr/local/lib/ruby/2.3.0/fileutils.rb:1500:in `wrap_traverse'
	from /usr/local/lib/ruby/2.3.0/fileutils.rb:469:in `copy_entry'
	from /usr/local/lib/ruby/2.3.0/fileutils.rb:444:in `block in cp_r'
	from /usr/local/lib/ruby/2.3.0/fileutils.rb:1571:in `block in fu_each_src_dest'

やりたいことはmtimeのコピーですが、FileUtils.cp_rでは:mtimeを個々のファイルごとに指定できないので:preserveを利用する以外に方法がありません(ここに別解があればそれでも良いのでBUGではなくMiscにしています)。
リファレンスによれば、:preserveは、

:preserve
真を指定すると更新時刻と、可能なら所有ユーザ・所有グループもコピーします。


と、`chown`については努力目標となっています。
というわけで、以下のように`Errno::EACCES`も救済したいです。

~~~diff
--- devl/ruby-2.3.1/lib/fileutils.rb	2015-12-16 14:07:31.000000000 +0900
+++ /usr/local/lib/ruby/2.3.0/fileutils.rb	2016-06-26 20:24:57.552398812 +0900
@@ -1410,7 +1410,7 @@ module FileUtils
         else
           File.chown st.uid, st.gid, path
         end
-      rescue Errno::EPERM
+      rescue Errno::EPERM, Errno::EACCES
         # clear setuid/setgid
         if st.symlink?
           begin

よろしくお願いします。

Updated by nobu (Nobuyoshi Nakada) over 8 years ago

  • Tracker changed from Misc to Bug
  • Description updated (diff)
  • Backport set to 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN

試してはいないのですが、FileUtils.install(preserve: true) ではどうでしょうか。

Updated by nobu (Nobuyoshi Nakada) over 8 years ago

  • Status changed from Open to Assigned
  • Assignee set to arton (Akio Tajima)

Updated by arton (Akio Tajima) over 8 years ago

  • Status changed from Assigned to Feedback

installは次の2点がcp_rと違って、あまり使いたくはないというのが本音です。

  1. file_compareで内容を比較する=> 実行ファイルのインストールなら理解できますが、サイズが違うかどうかで十分(この場合、全体量が数100GBあるので中まで読ませたくない。インストールならせいぜい100MB程度~数GB程度が対象とは思う)
  2. やりたいことはinstallではなく、再帰的なコピー(名前重要)
    とはいえ、代替案としては許容範囲でしょうね。
    (もうちょっと考えてみます)
    -----追記
    考えてみたら、宛先にディレクトリそのものが存在しないときにcp_rに任せている(宛先がある場合は自分で比較している)ので、そもそも読み込みは起きないので1.は嘘でした(あくまでも、私が想定している利用方法に限ってですが、数100GBというのも私の想定の利用方法なので無視可能)。

Updated by nobu (Nobuyoshi Nakada) over 8 years ago

まぁそれはそれとして入れといていいんじゃないでしょうか。
そういう環境があるということであれば。

Actions #5

Updated by arton (Akio Tajima) over 8 years ago

  • Status changed from Feedback to Closed

Applied in changeset r55525.


Tue Jun 28 22:09:09 2017 Akio Tajima

* lib/fileutils.rb: rescue Errno:EACCES for chown.
  [Bug #12520]
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0