diff options
author | Jan Blunck <jblunck@suse.de> | 2008-01-07 12:13:42 +0100 |
---|---|---|
committer | Jim Meyering <meyering@redhat.com> | 2008-01-07 12:13:42 +0100 |
commit | a54e8bb8a547c2ee9147865e2eb42eece69e8072 (patch) | |
tree | b7b423f0a2196c9591d1326c83cf38f5f2fcf668 /src | |
parent | db58094e11adb527c31b3510d3430123a4048686 (diff) | |
download | coreutils-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')
-rw-r--r-- | src/cp.c | 24 |
1 files changed, 12 insertions, 12 deletions
@@ -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, |