From a54e8bb8a547c2ee9147865e2eb42eece69e8072 Mon Sep 17 00:00:00 2001 From: Jan Blunck Date: Mon, 7 Jan 2008 12:13:42 +0100 Subject: 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. --- src/cp.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'src/cp.c') 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, -- cgit v1.2.3-54-g00ecf