From: Jim Meyering Date: Thu, 15 Nov 2007 12:04:13 +0000 (+0100) Subject: Avoid misbehavior of a cross-device "mv" or "install". X-Git-Tag: v6.9.90~52 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2ed532618f1df9efa39b94bb2507319f48b650cf;p=thirdparty%2Fcoreutils.git Avoid misbehavior of a cross-device "mv" or "install". Those programs must not dereference a destination symlink. * src/copy.c (copy_reg): Don't treat a dangling destination symlink differently in move mode. In move mode, the only way the added O_EXCL can cause failure is when some other process has recreated the file this code unlinked a few instructions before. --- diff --git a/ChangeLog b/ChangeLog index 308a4a53c4..4ba238955b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2007-11-15 Jim Meyering + + Avoid misbehavior of a cross-device "mv" or "install". + Those programs must not dereference a destination symlink. + * src/copy.c (copy_reg): Don't treat a dangling destination symlink + differently in move mode. In move mode, the only way the added + O_EXCL can cause failure is when some other process has recreated + the file this code unlinked a few instructions before. + 2007-11-14 Jim Meyering Another bootstrap kludge. diff --git a/src/copy.c b/src/copy.c index e1cd5fa21c..1a265e3c24 100644 --- a/src/copy.c +++ b/src/copy.c @@ -371,8 +371,9 @@ copy_reg (char const *src_name, char const *dst_name, the above open fails with EEXIST. If that happens, and lstat'ing the DST_NAME shows that it is a symlink, repeat the open call, but this time with the name of the final, - missing directory entry. */ - if (dest_desc < 0 && dest_errno == EEXIST) + missing directory entry. All of this is relevant only for + cp, i.e., not in move_mode. */ + if (dest_desc < 0 && dest_errno == EEXIST && ! x->move_mode) { struct stat dangling_link_sb; if (lstat (dst_name, &dangling_link_sb) == 0