diff options
author | David Kalnischkies <david@kalnischkies.de> | 2016-07-05 20:04:27 +0200 |
---|---|---|
committer | Julian Andres Klode <jak@debian.org> | 2016-08-31 13:49:37 +0200 |
commit | 366021988e2c7a7a6ca29d4f6876bb1e6c8b181f (patch) | |
tree | db192adf2aa1f51a5d44702c9f25f2cc9e2b75bf /methods/store.cc | |
parent | 89d816a77ca314654a8bef8c88a287b04e2c8519 (diff) |
don't change owner/perms/times through file:// symlinks
If we have files in partial/ from a previous invocation or similar such
those could be symlinks created by file:// sources. The code is
expecting only real files through and happily changes owner,
modification times and permission on the file the symlink points to
which tend to be files we have no business in touching in this way.
Permissions of symlinks shouldn't be changed, changing owner is usually
pointless to, but just to be sure we pick the easy way out and use
lchown, check for symlinks before chmod/utimes.
Reported-By: Mattia Rizzolo on IRC
(cherry picked from commit 3465138575e1fd0d5892d9b6be1ae232eb873460)
Diffstat (limited to 'methods/store.cc')
-rw-r--r-- | methods/store.cc | 16 |
1 files changed, 2 insertions, 14 deletions
diff --git a/methods/store.cc b/methods/store.cc index 2ad0f0177..515c63387 100644 --- a/methods/store.cc +++ b/methods/store.cc @@ -127,20 +127,8 @@ bool StoreMethod::Fetch(FetchItem *Itm) /*{{{*/ if (Failed == true) return false; - // Transfer the modification times - if (Itm->DestFile != "/dev/null") - { - struct stat Buf; - if (stat(Path.c_str(),&Buf) != 0) - return _error->Errno("stat",_("Failed to stat")); - - struct timeval times[2]; - times[0].tv_sec = Buf.st_atime; - Res.LastModified = times[1].tv_sec = Buf.st_mtime; - times[0].tv_usec = times[1].tv_usec = 0; - if (utimes(Itm->DestFile.c_str(), times) != 0) - return _error->Errno("utimes",_("Failed to set modification time")); - } + if (TransferModificationTimes(Path.c_str(), Itm->DestFile.c_str(), Res.LastModified) == false) + return false; // Return a Done response Res.TakeHashes(Hash); |