Subject: bug#10489: 24.0.92; dired-do-copy may create infinite directory hierarchy

From: Eli Zaretskii <[email-masked]>
Date: Fri, 13 Jan 2012 12:31:42 +0200

> From: Thierry Volpiatto <[email-masked]>
> Cc: [email-masked]
> Date: Fri, 13 Jan 2012 09:38:30 +0100
> 
> > I don't think this will solves all the use cases.  File names are not
> > strings, you cannot compare them as literal strings and hope to plumb
> > all the leaks.
> A test with `equal' is already used in `dired-create-files',
> (equal from to) 
> Is it the correct way to compare two filenames?

I don't see how `equal' could help, unless someone teaches it to treat
strings that are file names specially.  I don't see such treatment in
the current sources.

> > Some situations which I think this patch will not handle correctly:
> >
> >  . file names with different letter-case on a case-insensitive file
> >    system
> Can you provide example or better a recipe.

  emacs -Q
  C-x d ~ RET
  <go to the line showing "Test">
  C ~/test RET
  yes RET

> >  . relative vs absolute file names
> Same.

M-: (dired-copy-file-recursive "foo/../Test" "./Test" t) RET

> >  . file names that are hard links to the same directory (this includes
> >    the infamous 8+3 short aliases on Windows)
> Don't know on Windows, (My knowledge of links in windows is very
> limited) 
> here it is difficult (impossible as User) to Hardlink a directory:
> 
> --8<---------------cut here---------------start------------->8---
> man ln:
>      -d, -F, --directory
>           allow the superuser to attempt to hard link directories
>           (note: will  probably fail due to  system restrictions,
>           even for the superuser)
> --8<---------------cut here---------------end--------------->8---

We don't disallow superusers from using Emacs, nor restrict Emacs
usage only to filesystems where links to directories are impossible,
do we? ;-)

And what about symlinks?

On Windows, you can have "C:/PROGRA~1" be the alias of
"C:/Program Files", for example.

Bottom line, I think you need:

  . make both file names absolute by calling expand-file-name on each

  . resolve links by calling file-truename on each (this will handle
    the 8+3 alias issue, as well as, AFAIK, the issue with links)

  . compare case-insensitively on MS-Windows and MS-DOS