Chris Larson (kergoth) writes:
authorEric Andersen <andersen@codepoet.org>
Thu, 19 Feb 2004 00:44:08 +0000 (00:44 -0000)
committerEric Andersen <andersen@codepoet.org>
Thu, 19 Feb 2004 00:44:08 +0000 (00:44 -0000)
I was adding -s/--symbolic-link support to busybox cp when I noticed a
bug with -r/-a.  Test case:

mkdir -p test/out
cd test
busybox cp -a * out/

Will never return until we run out of open files or similar.
Coreutils cp on the other hand will error with "cannot copy a directory,
`out', into itself, `out'".  Patch attached.

libbb/copy_file.c

index 7ddb9a23fb745ad358bc8562c372246fd0b6bf95..637b8179b04a18835c700395c256b2fe7b8275e0 100644 (file)
@@ -65,12 +65,28 @@ int copy_file(const char *source, const char *dest, int flags)
                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)) {