Subject: bug#29788: closed (Re: bug#29788: chown: recursive operation with "-H" flag does not work as documented)

From: [email-masked] (GNU bug Tracking System)
Date: Wed, 20 Dec 2017 21:00:03 +0000

Your bug report

#29788: chown: recursive operation with "-H" flag does not work as documented

which was filed against the coreutils package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
29788: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=29788
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#29788: chown: recursive operation with "-H" flag does not work as documented
From: Bernhard Voelker <[email-masked]>
To: Michael Orlitzky <[email-masked]>, [email-masked]
Date: Wed, 20 Dec 2017 21:58:57 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

tag 29788 notabug
stop

On 12/20/2017 07:24 PM, Michael Orlitzky wrote:
> The documentation for the "-H" flag to chown says,
> 
>    The  following  options modify how a hierarchy is traversed when the
>    -R option is also specified.  If more than one  is  specified,  only
>    the final one takes effect.
> 
>      -H     if a command line argument is a symbolic link to a directory,
>             traverse it
> 
> This is not doing what I think it should do. In a terminal, as my "mjo"
> system user, I can run,
> 
>    $ mkdir foo
>    $ mkdir bar
>    $ ln -s ../bar foo/baz
>    $ sudo chown --verbose --recursive -H root foo
> 
> which outputs...
> 
>    changed ownership of 'foo/baz' from mjo to root
>    changed ownership of 'foo' from mjo to root
> 
> However, the path "foo/baz" was not passed on the command-line, and
> chown did in fact follow the symlink,
> 
>    $ ls -l | grep bar
>    drwxr-xr-x  2 root mjo 4.0K 2017-12-20 13:19 bar
> 
> as evidenced by the fact that "bar" was created as mjo:mjo.

I think there is something else going on you didn't consider:

       --dereference      affect the referent of each symbolic link (this is
                          the default), rather than the symbolic link itself

The -H option does not affect 'foo/baz' (or the target it references),
but only the command line arg 'foo'.  So the test case for -H is:

   $ mkdir bar bar/baz
   $ ln -s bar foo

   $ sudo chown --verbose --recursive -H root foo
   changed ownership of 'foo/baz' from berny to root
   changed ownership of 'foo' from berny to root

   $ find . -ls
   4014266      4 drwxr-xr-x   3  berny    users        4096 Dec 20 21:50 .
   4014269      4 drwxr-xr-x   3  root     users        4096 Dec 20 21:50 ./bar
   4014271      4 drwxr-xr-x   2  root     users        4096 Dec 20 21:50 ./bar/baz
   4014272      0 lrwxrwxrwx   1  berny    users           3 Dec 20 21:50 ./foo -> bar

Without -H, chown would not dereference 'foo', and change the ownership of
the symlink (on systems which support this):

   $ sudo chown --verbose --recursive root foo
   changed ownership of 'foo' from berny to root

   $ find . -ls
   4014266      4 drwxr-xr-x   3  berny    users        4096 Dec 20 21:51 .
   4014269      4 drwxr-xr-x   3  berny    users        4096 Dec 20 21:51 ./bar
   4014271      4 drwxr-xr-x   2  berny    users        4096 Dec 20 21:51 ./bar/baz
   4014272      0 lrwxrwxrwx   1  root     users           3 Dec 20 21:51 ./foo -> bar

Thus, I think this not a bug in chmod or the documentation, but in the
your expectations.  Therefore, I'm marking this as not-a-bug in our bug
tracker.  Of course, you are welcome to continue the discussion, and if
needed we can reopen this issue at a later point.

Have a nice day,
Berny

Subject: chown: recursive operation with "-H" flag does not work as documented
From: Michael Orlitzky <[email-masked]>
To: [email-masked]
Date: Wed, 20 Dec 2017 13:24:14 -0500
List-Id: <debbugs-submit.debbugs.gnu.org>

The documentation for the "-H" flag to chown says,

  The  following  options modify how a hierarchy is traversed when the
  -R option is also specified.  If more than one  is  specified,  only
  the final one takes effect.

    -H     if a command line argument is a symbolic link to a directory,
           traverse it

This is not doing what I think it should do. In a terminal, as my "mjo"
system user, I can run,

  $ mkdir foo
  $ mkdir bar
  $ ln -s ../bar foo/baz
  $ sudo chown --verbose --recursive -H root foo

which outputs...

  changed ownership of 'foo/baz' from mjo to root
  changed ownership of 'foo' from mjo to root

However, the path "foo/baz" was not passed on the command-line, and
chown did in fact follow the symlink,

  $ ls -l | grep bar
  drwxr-xr-x  2 root mjo 4.0K 2017-12-20 13:19 bar

as evidenced by the fact that "bar" was created as mjo:mjo.