Print this page
3619 cp -p clobbers permissions/ownership following symbolic links
@@ -18,10 +18,14 @@
*
* CDDL HEADER END
*/
/*
+ * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
+ */
+
+/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
@@ -1346,11 +1350,12 @@
int rc;
times[0] = ss.st_atim;
times[1] = ss.st_mtim;
- rc = utimensat(AT_FDCWD, to, times, 0);
+ rc = utimensat(AT_FDCWD, to, times,
+ ISLNK(s1) ? AT_SYMLINK_NOFOLLOW : 0);
#ifdef XPG4
if ((pflg || mve) && rc != 0) {
(void) fprintf(stderr,
gettext("%s: cannot set times for %s: "), cmd, to);
perror("");
@@ -1381,11 +1386,16 @@
*/
static int
chg_mode(char *target, uid_t uid, gid_t gid, mode_t mode)
{
int clearflg = 0; /* controls message printed upon chown() error */
+ struct stat st;
+ /* Don't change mode if target is symlink */
+ if (lstat(target, &st) == 0 && ISLNK(st))
+ return (0);
+
if (chown(target, uid, gid) != 0) {
#ifdef XPG4
if (mve) {
(void) fprintf(stderr, gettext("%s: cannot change"
" owner and group of %s: "), cmd, target);