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:
parent
03a0643fbc
commit
e0cbe48637
@ -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)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user