From e0cbe4863704c78ea703c06c0dd2d76ebac90f75 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Thu, 19 Feb 2004 00:44:08 +0000 Subject: 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. --- libbb/copy_file.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/libbb/copy_file.c b/libbb/copy_file.c index 7ddb9a2..637b817 100644 --- a/libbb/copy_file.c +++ b/libbb/copy_file.c @@ -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)) { -- cgit v1.1