summaryrefslogtreecommitdiff
path: root/src/cp.c
diff options
context:
space:
mode:
authorJan Blunck <jblunck@suse.de>2008-01-07 12:13:42 +0100
committerJim Meyering <meyering@redhat.com>2008-01-07 12:13:42 +0100
commita54e8bb8a547c2ee9147865e2eb42eece69e8072 (patch)
treeb7b423f0a2196c9591d1326c83cf38f5f2fcf668 /src/cp.c
parentdb58094e11adb527c31b3510d3430123a4048686 (diff)
downloadcoreutils-a54e8bb8a547c2ee9147865e2eb42eece69e8072.tar.xz
cp --parents: don't use uninitialized memory when restoring permissions
* src/cp.c (make_dir_parents_private): Always stat each source directory, in case its permissions are required in re_protect, when setting permissions of a just-created destination directory.
Diffstat (limited to 'src/cp.c')
-rw-r--r--src/cp.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/src/cp.c b/src/cp.c
index 99e1f73ec..be3701fc8 100644
--- a/src/cp.c
+++ b/src/cp.c
@@ -403,6 +403,7 @@ make_dir_parents_private (char const *const_dir, size_t src_offset,
slash++;
while ((slash = strchr (slash, '/')))
{
+ int src_errno;
/* Add this directory to the list of directories whose modes need
fixing later. */
struct dir_attr *new = xmalloc (sizeof *new);
@@ -412,12 +413,22 @@ make_dir_parents_private (char const *const_dir, size_t src_offset,
*attr_list = new;
*slash = '\0';
+ src_errno = (stat (src, &new->st) != 0
+ ? errno
+ : S_ISDIR (new->st.st_mode)
+ ? 0
+ : ENOTDIR);
+ if (src_errno)
+ {
+ error (0, src_errno, _("failed to get attributes of %s"),
+ quote (src));
+ return false;
+ }
if (stat (dir, &stats) != 0)
{
mode_t src_mode;
mode_t omitted_permissions;
mode_t mkdir_mode;
- int src_errno;
/* This component does not exist. We must set
*new_dst and new->st.st_mode inside this loop because,
@@ -425,17 +436,6 @@ make_dir_parents_private (char const *const_dir, size_t src_offset,
make_dir_parents_private creates only e_dir/../a if
./b already exists. */
*new_dst = true;
- src_errno = (stat (src, &new->st) != 0
- ? errno
- : S_ISDIR (new->st.st_mode)
- ? 0
- : ENOTDIR);
- if (src_errno)
- {
- error (0, src_errno, _("failed to get attributes of %s"),
- quote (src));
- return false;
- }
src_mode = new->st.st_mode;
/* If the ownership or special mode bits might change,