Chris Larson (kergoth) writes:

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.
This commit is contained in:
Eric Andersen 2004-02-19 00:44:08 +00:00
parent 03a0643fbc
commit e0cbe48637

View File

@ -65,12 +65,28 @@ int copy_file(const char *source, const char *dest, int flags)
DIR *dp; DIR *dp;
struct dirent *d; struct dirent *d;
mode_t saved_umask = 0; mode_t saved_umask = 0;
char *dstparent;
struct stat dstparent_stat;
if (!(flags & FILEUTILS_RECUR)) { if (!(flags & FILEUTILS_RECUR)) {
bb_error_msg("%s: omitting directory", source); bb_error_msg("%s: omitting directory", source);
return -1; 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. */ /* Create DEST. */
if (dest_exists) { if (dest_exists) {
if (!S_ISDIR(dest_stat.st_mode)) { if (!S_ISDIR(dest_stat.st_mode)) {