[MERGE] sftp transport: do not chmod a dir when unecessary (fix suid and sgid problems).
Christophe TROESTLER
Christophe.Troestler+bzr at umh.ac.be
Wed Jul 9 10:50:28 BST 2008
On Tue, 08 Jul 2008 20:29:31 -0500, John Arbash Meinel wrote:
>
> We specifically preserve the bits that were set on the .bzr/
> directory. (...) So if your top level .bzr/ directory doesn't have
> +w, then none of the directories underneath will. (...)
>
> The only question is when there isn't a .bzr/ directory to stat. I think we
> try to stat its containing directory, but I'm not positive if that is still
> the case.
Thanks for the clarification. In my case, the g+w bit was set when
the umask was 0002 and not when it was 0022 -- hence my question.
> First thing I see.. "stat.st_mode > 01000", but usually the fact the
> object is a file or directory is stored in the upper bits, so you
> should be masking those off.
You are right, I corrected this oversight (with Harald suggestion).
On Wed, 09 Jul 2008 11:10:42 +0200, Harald Meland wrote:
>
> If I've understood the sftp behaviour correctly, these bits will be
> cleared by the chmod() done immediately below this warning.
Correct.
> warning('About to chmod %s over sftp, which will result in its'
> ' suid or sgid bits being cleared. If you want to'
> ' preserve those bits, change your environment on the'
> ' server to use umask ...')
I have adopted your message.
Patch attached.
Cheers,
ChriS
-------------- next part --------------
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: christophe.troestler at umh.ac.be-20080709093751-\
# l5yht55owvjshi7f
# target_branch: file:///home/devel/bzr/bzr.dev/
# testament_sha1: 27a5456e271c10d58a3cffa30e2d36273639f86a
# timestamp: 2008-07-09 11:41:04 +0200
# base_revision_id: pqm at pqm.ubuntu.com-20080709054822-jrzq8pdw4w7ob493
#
# Begin patch
=== modified file 'bzrlib/transport/sftp.py'
--- bzrlib/transport/sftp.py 2008-05-08 04:33:38 +0000
+++ bzrlib/transport/sftp.py 2008-07-09 09:36:41 +0000
@@ -519,7 +519,21 @@
try:
self._get_sftp().mkdir(abspath, local_mode)
if mode is not None:
- self._get_sftp().chmod(abspath, mode=mode)
+ # chmod a dir through sftp will erase any sgid bit set
+ # on the server side. So, if the bit mode are already
+ # set, avoid the chmod. If the mode is not fine but
+ # the sgid bit is set, report a warning to the user
+ # with the umask fix.
+ stat = self._get_sftp().lstat(abspath)
+ mode = mode & 0777 # can't set special bits anyway
+ if mode != stat.st_mode & 0777:
+ if stat.st_mode & 06000:
+ warning('About to chmod %s over sftp, which will result'
+ ' in its suid or sgid bits being cleared. If'
+ ' you want to preserve those bits, change your '
+ ' environment on the server to use umask 0%03o.'
+ % (abspath, 0777 - mode))
+ self._get_sftp().chmod(abspath, mode=mode)
except (paramiko.SSHException, IOError), e:
self._translate_io_exception(e, abspath, ': unable to mkdir',
failure_exc=FileExists)
# Begin bundle
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
df/i7kinChIaZ73SIA==
More information about the bazaar
mailing list