Subject: bug#36966: closed (Re: bug#36966: install-sh -s on 555 executable fails)

From: [email-masked] (GNU bug Tracking System)
Date: Sun, 22 Nov 2020 02:10:03 +0000

Your bug report

#36966: install-sh -s on 555 executable fails

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

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

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

Subject: Re: bug#36966: install-sh -s on 555 executable fails
From: Karl Berry <[email-masked]>
To: [email-masked]
Date: Sat, 21 Nov 2020 19:08:57 -0700
List-Id: <debbugs-submit.debbugs.gnu.org>

    chmod 555 /tmp/rx             # make unwritable to owner
    install-sh -s /tmp/rx /tmp/sx # try to install, with strip
    -> strip: unable to copy file '/tmp/_inst.31092_'; reason: Permission denied

Paul fixed this install-sh bug that I reported last August (commit of
2019-08-26). Closing.

Subject: install-sh -s on 555 executable fails
From: Karl Berry <[email-masked]>
To: [email-masked]
Date: Wed, 7 Aug 2019 15:50:53 -0600
List-Id: <debbugs-submit.debbugs.gnu.org>

(I'm not on this list, so please keep me in cc if need be.)

It seems that install-sh -s (what automake's install-strip target can
end up doing) fails if the original file doesn't have the owner-write
bit set:

cp /bin/cp /tmp/rx            # any binary will do
chmod 555 /tmp/rx             # make unwritable to owner
install-sh -s /tmp/rx /tmp/sx # try to install, with strip
-> strip: unable to copy file '/tmp/_inst.31092_'; reason: Permission denied
echo $?
-> 1

Although install-sh (version 2018-03-11.20, lines 224ff.) does some
stuff to ensure that umask will not clear an owner-writable bit in the
destination, that's not enough to make it owner-writable if it's not
already.

The only less-than-wonderful fix I could come up with is to explicitly
do chmod u+w if strip is being executed. I thought maybe it would be
worth trying the strip even if the chmod failed, hence the ; instead of
&&, but it's not something I feel strongly about. And maybe there is
some nicer way to do it altogether.

--- a/build-aux/install-sh
+++ b/build-aux/install-sh
@@ -461,7 +461,7 @@ do
     #
     { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
     { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
-    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || ($doit $chmodcmd u+w "$dsttmp"; $doit $stripcmd "$dsttmp") } &&
     { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
 
     # If -C, don't bother to copy if it wouldn't change the file.

Wdyt? --thanks, karl.