[BusyBox-cvs] busybox/libbb copy_file.c,1.29,1.30

Erik Andersen andersen at busybox.net
Thu Feb 19 01:52:31 UTC 2004


Update of /var/cvs/busybox/libbb
In directory nail:/tmp/cvs-serv20316/libbb

Modified Files:
	copy_file.c 
Log Message:
Chris Larson (kergoth) writes:

As Manuel points out, this is a flawed fix, and doesnt fix the
following:

mkdir -p cpa cpb cpc
cp -a cpa cpa/cpb/cpc

Attached what appears to be a more sane fix.  Apply on top of previous.
Please confirm sanity.



Index: copy_file.c
===================================================================
RCS file: /var/cvs/busybox/libbb/copy_file.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- copy_file.c	19 Feb 2004 00:44:08 -0000	1.29
+++ copy_file.c	19 Feb 2004 01:52:29 -0000	1.30
@@ -65,28 +65,12 @@
 		DIR *dp;
 		struct dirent *d;
 		mode_t saved_umask = 0;
-		char *dstparent;
-		struct stat dstparent_stat;
 
 		if (!(flags & FILEUTILS_RECUR)) {
 			bb_error_msg("%s: omitting directory", source);
 			return -1;
 		}
 
-		dstparent = dirname(bb_xstrdup(dest));
-		if (lstat(dstparent, &dstparent_stat) < 0) {
-			bb_perror_msg("unable to stat `%s'", dstparent);
-			free(dstparent);
-			return -1;
-		}
-		free(dstparent);
-
-		if (source_stat.st_dev == dstparent_stat.st_dev &&
-			source_stat.st_ino == dstparent_stat.st_ino) {
-			bb_error_msg("cannot copy a directory, `%s', into itself, `%s'", source, dest);
-			return -1;
-		}
-
 		/* Create DEST.  */
 		if (dest_exists) {
 			if (!S_ISDIR(dest_stat.st_mode)) {
@@ -111,6 +95,8 @@
 			umask(saved_umask);
 		}
 
+		add_to_ino_dev_hashtable(&dest_stat, source);
+
 		/* Recursively copy files in SOURCE.  */
 		if ((dp = opendir(source)) == NULL) {
 			bb_perror_msg("unable to open directory `%s'", source);
@@ -124,6 +110,10 @@
 			new_source = concat_subpath_file(source, d->d_name);
 			if(new_source == NULL)
 				continue;
+			if (is_in_ino_dev_hashtable(&dest_stat, &new_source)) {
+				bb_error_msg("cannot copy a directory, `%s', into itself, `%s'", new_source, dest);
+				continue;
+			}
 			new_dest = concat_path_file(dest, d->d_name);
 			if (copy_file(new_source, new_dest, flags) < 0)
 				status = -1;




More information about the busybox-cvs mailing list