public inbox for cygwin@cygwin.com
 help / color / mirror / Atom feed
* Strange paths in NTFS reparse points created by Cygwin Setup for e.g. TTF fonts
       [not found] <245e2446-8c1e-cbaa-a4ad-215d7e766274.ref@yahoo.de>
@ 2020-11-05 21:41 ` Michael Soegtrop
  2020-11-05 22:39   ` Ken Brown
  2020-11-06  5:31   ` L A Walsh
  0 siblings, 2 replies; 6+ messages in thread
From: Michael Soegtrop @ 2020-11-05 21:41 UTC (permalink / raw)
  To: cygwin

Dear Cyhwin Users and Team,

since a while I have issues removing cygwin installations, especially 
the symlinks to true type fonts in /usr/share/fonts/microsoft.

Looking at these links with Windows tools I get:

C:\bin\cygwin\usr\share\fonts\microsoft>fsutil reparsepoint query 
wingding.ttf
Reparse Tag Value : 0xa000001d
Tag value: Microsoft
Tag value: Name Surrogate

Reparse Data Length: 0x00000025
Reparse Data:
0000:  02 00 00 00 2f 6d 6e 74  2f 63 2f 57 69 6e 64 6f  ..../mnt/c/Windo
0010:  77 73 2f 46 6f 6e 74 73  2f 77 69 6e 67 64 69 6e  ws/Fonts/wingdin
0020:  67 2e 74 74 66                                    g.ttf

I wonder if the path "/mnt/c/Windows/Fonts/wingding.ttf" is something 
which should be written into a NTFS reparse point by cygwin setup. 
Probably not - it looks like a cygwin path and it is understandable that 
this confuses NTFS.



Btw.: I meanwhile managed to reliably remove cygwin install folders with 
the below command sequence ($1 being the cygwin folder name) - sorry an 
ugly mix of bash and DOS tools:


PATH_WINFMT="$(cygpath -w -a $1)"

rm -rf "$1" && { echo "first removal run successful"; exit; }

TAKEOWN /F "$PATH_WINFMT" /R /D Y

ICACLS "$PATH_WINFMT" /grant <your user name>:F /T

CMD /C "DIR /AL /S /B $PATH_WINFMT" | sed 's|\\|\\\\|g' | tr -d "\r" | 
while read f; do echo removing reparsepoint "$f"; FSUTIL REPARSEPOINT 
DELETE "$f"; done

rm -rfv "$1"


Best regards,

Michael

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Strange paths in NTFS reparse points created by Cygwin Setup for e.g. TTF fonts
  2020-11-05 21:41 ` Strange paths in NTFS reparse points created by Cygwin Setup for e.g. TTF fonts Michael Soegtrop
@ 2020-11-05 22:39   ` Ken Brown
  2020-11-08 14:40     ` Michael Soegtrop
  2020-11-06  5:31   ` L A Walsh
  1 sibling, 1 reply; 6+ messages in thread
From: Ken Brown @ 2020-11-05 22:39 UTC (permalink / raw)
  To: Michael Soegtrop, cygwin

On 11/5/2020 4:41 PM, Michael Soegtrop via Cygwin wrote:
> Dear Cyhwin Users and Team,
> 
> since a while I have issues removing cygwin installations, especially the 
> symlinks to true type fonts in /usr/share/fonts/microsoft.
> 
> Looking at these links with Windows tools I get:
> 
> C:\bin\cygwin\usr\share\fonts\microsoft>fsutil reparsepoint query wingding.ttf
> Reparse Tag Value : 0xa000001d
> Tag value: Microsoft
> Tag value: Name Surrogate

This is the IO_REPARSE_TAG_LX_SYMLINK tag, which WSL uses for symlinks and which 
Cygwin also uses by default for symlinks on systems that support it.  But you 
can change this if you don't like it, as I said in my reply to your earlier 
message about this:

   https://cygwin.com/pipermail/cygwin/2020-September/246277.html

> Reparse Data Length: 0x00000025
> Reparse Data:
> 0000:  02 00 00 00 2f 6d 6e 74  2f 63 2f 57 69 6e 64 6f  ..../mnt/c/Windo
> 0010:  77 73 2f 46 6f 6e 74 73  2f 77 69 6e 67 64 69 6e  ws/Fonts/wingdin
> 0020:  67 2e 74 74 66                                    g.ttf
> 
> I wonder if the path "/mnt/c/Windows/Fonts/wingding.ttf" is something which 
> should be written into a NTFS reparse point by cygwin setup. Probably not - it 
> looks like a cygwin path and it is understandable that this confuses NTFS.

It's not written by setup.  It's a Cygwin symlink [also a WSL symlink, as I said 
above], created by the postinstall script

   /etc/postinstall/zp_fontconfig_cache_1.sh

The fact that it contains a Cygwin path as its reparse data is not at all 
surprising:

ls -l /usr/share/fonts/microsoft/wingding.ttf
lrwxrwxrwx ... /usr/share/fonts/microsoft/wingding.ttf -> 
/c/Windows/Fonts/wingding.ttf

Ken

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Strange paths in NTFS reparse points created by Cygwin Setup for e.g. TTF fonts
  2020-11-05 21:41 ` Strange paths in NTFS reparse points created by Cygwin Setup for e.g. TTF fonts Michael Soegtrop
  2020-11-05 22:39   ` Ken Brown
@ 2020-11-06  5:31   ` L A Walsh
  1 sibling, 0 replies; 6+ messages in thread
From: L A Walsh @ 2020-11-06  5:31 UTC (permalink / raw)
  To: Michael Soegtrop; +Cc: cygwin

On 2020/11/05 13:41, Michael Soegtrop via Cygwin wrote:
> I wonder if the path "/mnt/c/Windows/Fonts/wingding.ttf" is something 
> which should be written into a NTFS reparse point by cygwin setup. 
> Probably not - it looks like a cygwin path and it is understandable that 
> this confuses NTFS.
>   
====
    Uh....except that "/mnt/c/Windows/Fonts/wingding.ttf" is a valid
NT pathname (file and reg).  For that matter, "/mnt/\x00\x01\x04" is a valid
NT pathname -- how, why?: NT uses a 'count' hidden before the string, so any
character is valid.  However, the above is not universally true in 'Windows'
where some system libraries enforce using backslash as the separator.

    I'm guessing you get some permission denied messages when you try
to delete some fonts.  This can happen in 2 cases: 1) if you try to 
delete the
file in cygwin or 2), if some program hardlinked the font to the same in the
windows directory instead of symlinking it. 

    With both, it comes down to your delete command trying to delete
(for example) a font that is linked into the /windows/fonts dir
and some program (or lib) already has it open.

    Generally, you can't delete *open* files in Windows.  In windows,
an open will lock some range of bytes on the disk.  Windows "lock"s
are locks on byte ranges, "on disk" that windows won't let you write
to, move or delete while someone has that file open.




   

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Strange paths in NTFS reparse points created by Cygwin Setup for e.g. TTF fonts
  2020-11-05 22:39   ` Ken Brown
@ 2020-11-08 14:40     ` Michael Soegtrop
  2020-11-08 16:38       ` Ken Brown
  2020-11-09  2:14       ` L A Walsh
  0 siblings, 2 replies; 6+ messages in thread
From: Michael Soegtrop @ 2020-11-08 14:40 UTC (permalink / raw)
  To: Ken Brown, cygwin, L A Walsh

Hi Ken, L A Walsh,

 > But you can change this if you don't like it, as I said in my reply 
to your earlier message about this:

I don't know if I like it yet - I am still in the process of 
understanding what is going on.

I maintain the Windows build of a large open source project and we also 
deliver scripts to setup cygwin on our user's machines. I need to 
understand what is going on before I make changes to settings. I am 
afraid that using non standard settings in the end will lead to more 
confusion than good - especially if people have several cygwin 
installations. Also I need to be able to support our users in case they 
have issues with this.

The interesting point is that in our CI we do several 100 cygwin 
installations (sometimes more than 1000) per month. For 95%..99% the 
removal with "rm -rf" from another cygwin installation works well, in 
about 1%..5% of the case about 250 symlinks / reparse points remain. 
This happens all on the same machines with identical scripts.

With my manual installations of cygwin it is about the same ratio. I had 
two cases where removing a cygwin installation from Windows explorer 
with "shift+delete" did not work cause of these about 250 symlinks - I 
would say I did roughly 100 installations in this time frame.

What I don't understand is why it does work sometimes and sometimes not. 
I always use the same scripts to install and remove cygwin on the same 
machines and then do pretty much the same thing with this cygwin (build 
our open source software) before I delete it.

It is unlikely that the issue is that the target files are open as L A 
Welsh suggested because always either all symlinks or none at all 
remain. The number is always the same (with recent versions afair 258).

@ L A Walsh: you wrote "1) if you try to delete the file in cygwin"

Why shouldn't I be able to remove symlinks with rm -rf from within a 
cygwin? As far as I understand the standard behavior of "rm" is to 
remove the symlink and not its target. What I do when I remove a cygwin 
installation in our CI is an "rm -rf" from a different cygwin 
installation. As I said in most cases this works but rarely it doesn't.

In case it doesn't work the symlinks are quite hard to get rid of. 
FSUTIL REPARSEPOINT DELETE is the only method which works I found so 
far. Even after a reboot, resetting the ACLs in various ways, ... no 
usual method to remove these files works.

I understand that the contents / path of the symlink is as expected, so 
I am looking out for other oddities which could explain this behavior.

Best regards,

Michael


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Strange paths in NTFS reparse points created by Cygwin Setup for e.g. TTF fonts
  2020-11-08 14:40     ` Michael Soegtrop
@ 2020-11-08 16:38       ` Ken Brown
  2020-11-09  2:14       ` L A Walsh
  1 sibling, 0 replies; 6+ messages in thread
From: Ken Brown @ 2020-11-08 16:38 UTC (permalink / raw)
  To: Michael Soegtrop, cygwin, L A Walsh

On 11/8/2020 9:40 AM, Michael Soegtrop wrote:
> Why shouldn't I be able to remove symlinks with rm -rf from within a cygwin? As 
> far as I understand the standard behavior of "rm" is to remove the symlink and 
> not its target. What I do when I remove a cygwin installation in our CI is an 
> "rm -rf" from a different cygwin installation. As I said in most cases this 
> works but rarely it doesn't.
[...]
> I understand that the contents / path of the symlink is as expected, so I am 
> looking out for other oddities which could explain this behavior.

I've seen this behavior only in the following situation.  Suppose you create a 
symlink in one Cygwin installation that uses WSL symlinks.  Then you try to 
delete it from a different Cygwin installation with version < 3.1.5 (which is 
when WSL symlinks were first supported).  This will fail, because the older 
Cygwin installation will see a reparse point of a type that it doesn't recognize.

 From what you say, it sounds like this doesn't apply to your situation, so I'm 
at a loss to explain it.

Do you get any error message when you're unable to delete a symlink in one 
Cygwin installation from another?  If not, you could try running 'rm <cygwin 
root>/usr/share/fonts/microsoft/wingding.ttf' under strace to see if that give 
you any clues.  You could also try 'file', 'ls -l', 'stat', etc., to see if 
Cygwin is correctly recognizing the file as a symlink.

For example, I have a Cygwin installation in C:\cygwin64test.  From a different 
Cygwin installation in which C: is mounted on /c, I see the following:

$ file /c/cygwin64test/usr/share/fonts/microsoft/wingding.ttf
/c/cygwin64test/usr/share/fonts/microsoft/wingding.ttf: symbolic link to 
/c/Windows/Fonts/wingding.ttf

Now I remove that symlink under strace:

$ strace -o strace.out rm /c/cygwin64test/usr/share/fonts/microsoft/wingding.ttf

In the file strace.out I see

    57   26112 [main] rm 39456 symlink_info::check: 0x0 = NtCreateFile 
(\??\C:\cygwin64test\usr\share\fonts\microsoft\wingding.ttf)
   100   26212 [main] rm 39456 symlink_info::check: 29 = 
symlink.check(C:\cygwin64test\usr\share\fonts\microsoft\wingding.ttf, 
0xFFFFB680) (mount_flags 0x4008, path_flags 0x10)
    26   26238 [main] rm 39456 path_conv::check: 
this->path(C:\cygwin64test\usr\share\fonts\microsoft\wingding.ttf), has_acls(1)
    25   26263 [main] rm 39456 _unlink_nt: Trying to delete 
\??\C:\cygwin64test\usr\share\fonts\microsoft\wingding.ttf, isdir = 0
   218   26481 [main] rm 39456 _unlink_nt: 
\??\C:\cygwin64test\usr\share\fonts\microsoft\wingding.ttf, return status = 0x0
    33   26514 [main] rm 39456 unlink: 0 = 
unlink(/c/cygwin64test/usr/share/fonts/microsoft/wingding.ttf)

In your case I would expect to see some errors reported when you are unable to 
remove the symlink.

Ken

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Strange paths in NTFS reparse points created by Cygwin Setup for e.g. TTF fonts
  2020-11-08 14:40     ` Michael Soegtrop
  2020-11-08 16:38       ` Ken Brown
@ 2020-11-09  2:14       ` L A Walsh
  1 sibling, 0 replies; 6+ messages in thread
From: L A Walsh @ 2020-11-09  2:14 UTC (permalink / raw)
  To: Michael Soegtrop; +Cc: Ken Brown, cygwin



On 2020/11/08 06:40, Michael Soegtrop wrote:
> What I don't understand is why it does work sometimes and sometimes not. 
> I always use the same scripts to install and remove cygwin on the same 
> machines and then do pretty much the same thing with this cygwin (build 
> our open source software) before I delete it.
----
	Likely because the windows settings are different on the
various machines -- especially the various policies.

	But, first, basic, you know that windows symlinks are
turned off for normal users by default when they first get it (i.e. they
can't create them).  Which ways work and who can create them are settings
under fsultil/behavior/(set/query) symlinkEvaluation.  These 4 settings
control directions of symlinking

	There's another setting that is suppose to control where fonts
can be installed, but can't find it off hand -- in the group policy 
editor.  If I remember, it was suppose to allow/disallow fonts being
installed in folders other than /windows/fonts.  I think the default
might be to allow, but am not sure.  I thought I disabled it, and what
I've seen is the same font-file hardlinked between windows/fonts
and the application path.  


> It is unlikely that the issue is that the target files are open as L A 
> Welsh suggested because always either all symlinks or none at all 
> remain. The number is always the same (with recent versions afair 258).
----
	Windows doesn't hold open all fonts -- but some subset -- they
have some font cache services that may be running at times to support
some apps.  So could be if one of those apps has run, it started its
font caching service, which could lock it.  Each font system has a
set of "core fonts" that it will load whether they are called upon
or not -- that could create a toggle situation between a bunch being
used or not.

	Some applications (though I don't think rm does this) will
follow the symlink by default, so when they try to delete a file,
it doesn't delete the symlink but tries to delete the font, which
may be opened by some service.  

	BTW, are you familiar with 'Process Hacker' (google it, its
open source, and hasn't been changed for a while).  It can replace
the task manager and ProcessExplorer that MS helps distribute.
It's more powerful than either.  But specifically if you can't delete
a file, you can find out what process(es) have the file open.

	Finding that out might enable you to find the what apps
might be running and holding those files open.  Symlinks and
their older counterparts mountd+junction have different formats
for directories and volumes.  Some will work with network, some not.

	If they are all Microsoft windows symlinks, you might
look at the fsutil settings -- as well as open files.

	You maybe said, but don't remember -- is there any error
message when you can't delete those files?

> 
> @ L A Walsh: you wrote "1) if you try to delete the file in cygwin"
> 
> Why shouldn't I be able to remove symlinks with rm -rf from within a 
> cygwin? As far as I understand the standard behavior of "rm" is to 
> remove the symlink and not its target. 
---
	With posix/linux type symlinks, yes, but am not equally
sure that windows behaves the same in all circumstances.  One thing
you could try is to use cygwin-only symlinks and not use
native symlinks -- the cygwin-only links should be more reliably
just controlled by cygwin rules.  If they are native links, there
might be some windows settings interaction(s).

> In case it doesn't work the symlinks are quite hard to get rid of. 
> FSUTIL REPARSEPOINT DELETE is the only method which works I found so 
> far. Even after a reboot, resetting the ACLs in various ways, ... no 
> usual method to remove these files works.
---
	How were these links created?  Also, MSsymlinks unlike
unix symlinks require the target's existence when they are setup.
unix symlinks do no checks on the target.  If the target is missing,
some operations on that symlink (if it is a win-symlink) might not
work as expected.

	Also note, that these two entries in my root dir
look like this from unix:
lrwxrwxrwx   1           20 Nov  6  2014 Prog -> /Program Files (x86)/
lrwxrwxrwx   1           13 Apr 21  2013 Prog64 -> Program Files/

Both sorta look like symlinks.  But in windows, they look 
different because they were made differently, and they may
have different effects on 'rm' from cygwin.

2014/11/06  19:45    <JUNCTION>     Prog [C:\Program Files (x86)]
2013/04/21  22:53    <SYMLINKD>     Prog64 [Program Files]


1. Make sure the symlinks you see in cygwin are the same type.
2. you say you have symlinks left over after you try deletion.
Do they point to existing files? or not?  If not, what happens if
you create the target of one of them, and then try deleting the
symlink?  
3. you said you had to use fsutil to remove some symlinks --
have you tried just 'del' in windows? 

Anyway, sorry to write so much, but I'm trying to point to how there
can be many differences, even when you think you are doing the same
thing to delete a cygwin.

-linda

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-11-09  2:15 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <245e2446-8c1e-cbaa-a4ad-215d7e766274.ref@yahoo.de>
2020-11-05 21:41 ` Strange paths in NTFS reparse points created by Cygwin Setup for e.g. TTF fonts Michael Soegtrop
2020-11-05 22:39   ` Ken Brown
2020-11-08 14:40     ` Michael Soegtrop
2020-11-08 16:38       ` Ken Brown
2020-11-09  2:14       ` L A Walsh
2020-11-06  5:31   ` L A Walsh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).