Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 15 Sep 2002 00:07:55 +0200 (CEST)
From:      Slaven Rezic <eserte@vran.herceg.de>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   bin/42789: cp -p may report wrong exit status
Message-ID:  <200209142207.g8EM7tXK020830@vran.herceg.de>

next in thread | raw e-mail | index | archive | help

>Number:         42789
>Category:       bin
>Synopsis:       cp -p may report wrong exit status
>Confidential:   no
>Severity:       critical
>Priority:       high
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Sep 14 15:20:02 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator:     Slaven Rezic
>Release:        FreeBSD 4.6-STABLE i386
>Organization:
www.rezic.de
>Environment:
System: FreeBSD vran.herceg.de 4.6-STABLE FreeBSD 4.6-STABLE #15: Sat Jul 27 09:32:28 CEST 2002 root@vran.herceg.de:/usr/local/src/FreeBSD-4/src/sys/compile/VRAN i386


	
>Description:

	cp -p may report success when a copy fails but setting the
	mode bits (via setfile()) succeeds. This may be fatal for mv,
	which relies on the exit code of cp.

>How-To-Repeat:
	
	Use mv on a directory with a big file between different filesystems.
	The big file should be too large for the target filesystem.
	Hence the mv fails, but the source directory is nevertheless
	deleted.

>Fix:

	
--- bin/cp/cp.c.orig	Sat Sep 14 23:52:30 2002
+++ bin/cp/cp.c	Sat Sep 14 23:57:35 2002
@@ -250,7 +250,7 @@ copy(argv, type, fts_options)
 	struct stat to_stat;
 	FTS *ftsp;
 	FTSENT *curr;
-	int base = 0, dne, badcp, nlen, rval;
+	int base = 0, dne, badcp, nlen, rval, newrval;
 	char *p, *target_mid;
 	mode_t mask, mode;
 
@@ -350,9 +350,11 @@ copy(argv, type, fts_options)
 			 * honour setuid, setgid and sticky bits, but we
 			 * normally want to preserve them on directories.
 			 */
-			if (pflag)
-				rval = setfile(curr->fts_statp, 0);
-			else {
+			if (pflag) {
+				newrval = setfile(curr->fts_statp, 0);
+				if (newrval)
+					rval = newrval;
+			} else {
 				mode = curr->fts_statp->st_mode;
 				if ((mode & (S_ISUID | S_ISGID | S_ISTXT)) ||
 				    ((mode | S_IRWXU) & mask) != (mode & mask))


>Release-Note:
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200209142207.g8EM7tXK020830>