Cygwin, Unicode and "long" path names
Brian Inglis
Brian.Inglis@SystematicSw.ab.ca
Sat Jun 26 19:16:44 GMT 2021
On 2021-06-25 19:53, Vadim wrote:
> Ah, this beautiful topic. Windows 7 x64.
>
> This is the summary written as post-scriptum, tests and findings below:
>
> 1) Cygwin limits individual names to 255 bytes, Windows seems to follow
> UTF-16 chars and work fine: 256 bytes in 108 characters works.
>
> Basically, this becomes a bytes vs characters story.
>
> 2) Bash file name auto-expansion detects the file of that name, but it
> gets truncated to 255 bytes. find's behaviour is the same ("No such file
> or directory" due to trying to access a non-existing truncated name)
>
> 2.1) If you try to correct the above mistake by adding truncated
> characters, then the program (cat) will complain about "File name too long"
>
> 2.2) If there exists a folder with a 255-byte name, equal to the
> truncated name, then "find ." will do a listing on that folder twice
> (effectively hiding the long-named folder from tools without leaving an
> error message)
>
> 3) UNC Paths get the same treatment: File name too long.
>
> I expected Cygwin to handle these names without problems just like
> Windows, Explorer, cmd etc. do. Is this particular problem new or known?
> All I could find on the mailing list is around the time when Cygwin
> hadn't yet implemented Unicode support (UTF-8?), ~2004-2008.
>
> These names were created by youtube-dl.exe executed from within Cygwin.
> This file name is 255 bytes long and works:
>
> s123點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記
> 轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃
> 走︱蘋果日報 Apple Daily #香港新聞.txt
>
> This is 256 bytes and works perfectly normal in Windows (explorer, can
> paste and "dir <name>" in cmd despite showing [] block chars), but not
> Cygwin terminal (I used s123/s1234 as a prefix for easy auto-expansion):
>
> s1234點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O
> 記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙
> 逃走︱蘋果日報 Apple Daily #香港新聞.txt
>
>
> If I try to use tab-expansion in the terminal (mintty, bash) the problem
> becomes apparent ("xt" missing at the end):
>
> $ cat s1234點半蘋果新聞報道\ 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫
> 骨場\ O記轉介律政司︱新巴車長被判不小心駕駛罪成 ︱深圳賽格大樓離奇劇晃\
> 民眾慌忙逃走︱蘋果日報\ Apple\ Daily\ #香港新聞.t
> cat: 's1234點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫
> 骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民
> 眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.t': No such file or directory
>
>
> However, with one fewer byte it expands properly:
>
> $ cat s123點半蘋果新聞報道\ 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫
> 骨場\ O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃\
> 民眾慌忙逃走︱蘋果日報\ Apple\ Daily\ #香港新聞.txt
> hello
>
>
> MAX_PATH? Yes, 255 bytes. Why then does the full file/folder name work
> in Windows? This is the full name (a folder), 257 bytes:
>
> 20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨
> 場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾
> 慌忙逃走︱蘋果日報 Apple Daily #香港新聞
>
> And it can get longer! In fact, I can bump the total path to 396 bytes
> or "Column 249" as Notepad++ counts the characters (individual folder
> name is 359b or 211 chars, "column 212"):
>
> D:/abcdefgh/Local_TEMP/cygwinunicode
> /1_123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789020210518_9
> 點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介
> 律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱
> 蘋果日報 Apple Daily #香港新聞
>
>
> NTFS allows up to 255 UTF-16 for an individual path segment and this
> seems to align with the Windows tooling: cmd and Explorer can browse
> these fine, but the included file in the folder spills beyond the limit
> and you run into the usual 'total path too long' problem).
>
> Whether you manually add the missing "xt" to the tab-completion or use
> UNC paths, the result is the same:
>
> $ cat s1234點半蘋果新聞報道\ 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫
> 骨場\ O記轉介律政司︱新巴車長被判不小心駕駛罪成 ︱深圳賽格大樓離奇劇晃\
> 民眾慌忙逃走︱蘋果日報\ Apple\ Daily\ #香港新聞.txt
> cat: 's1234點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫
> 骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民
> 眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt': File name too long
> $ cat '\\?\D:\abcdefgh\Local_TEMP\cygwinunicode\20210518_9點半蘋果新聞報
> 道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車
> 長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple
> Daily #香港新聞.txt'
> cat: '\\?\D:\abcdefgh\Local_TEMP\cygwinunicode\20210518_9點半蘋果新聞報
> 道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車
> 長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple
> Daily #香港新聞.txt': File name too long
Filename 113 characters, 261 bytes:
$ wc -lwmcL <<< '20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)
︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格
大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt'
1 7 114 262 187
$ strace -o touch.strace /usr/bin/touch '20210518_9點半蘋果新聞報道 字幕
版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判
不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily
#香 港新聞.txt'
/usr/bin/touch: cannot touch '20210518_9點半蘋果新聞報道 字幕版重溫
(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱
新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報
Apple Daily #香港新聞.txt': File name too long
Trim 2 leading and 4 trailing bytes and it works:
/usr/bin/touch '210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡
展鵬光顧賣淫骨場 O記轉介 律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大
樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞'
$ l '210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣
淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃
民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞'
'210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨
場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾
慌忙逃走︱蘋果日報 Apple Daily #香港新聞'
Attached sanitized excerpt from strace of failure case, showing:
168 108424 [main] touch 38975 path_conv::check:
this->path($HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)
︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格
大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt), has_acls(1)
45 108469 [main] touch 38975 __set_errno: int
utimens_worker(path_conv&, const timespec*):345 setting errno 91
46 108515 [main] touch 38975 utimens_worker: -1 = utimes(/??/$HOME
/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫
骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民
眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt, 0x0), errno 91
which appears to show that times.cc(utimens_worker) gets a zero return
value from dtable.cc(build_fh_pc) which has done something which sets
errno ENAMETOOLONG (91).
--
Take care. Thanks, Brian Inglis, Calgary, Alberta, Canada
This email may be disturbing to some readers as it contains
too much technical detail. Reader discretion is advised.
[Data in binary units and prefixes, physical quantities in SI.]
-------------- next part --------------
...
58 64875 [main] touch 38975 pinfo_init: Set nice to 0
45 64920 [main] touch 38975 pinfo_init: pid 38975, pgid 38975, process_state 0x41
43 64963 [main] touch 38975 App version: 2007.0, api: 0.306
48 65011 [main] touch 38975 DLL version: 3002.0, api: 0.340
64 65075 [main] touch 38975 DLL build: 2021-03-29 08:42
206 65281 [main] touch 38975 dtable::extend: size 32, fds 0x18035E180
371 65652 [main] touch 38975 __get_lcid_from_locale: LCID=0x1009
583 66235 [main] touch 38975 transport_layer_pipes::connect: Try to connect to named pipe: /./pipe/cygwin-f031669020b3f992-lpc
296 66531 [main] touch 38975 transport_layer_pipes::connect: Try to connect to named pipe: /./pipe/cygwin-f031669020b3f992-lpc
277 66808 [main] touch 38975 transport_layer_pipes::connect: Try to connect to named pipe: /./pipe/cygwin-f031669020b3f992-lpc
212 67020 [main] touch 38975 cygheap_user::ontherange: what 2, pw 0x18035E3A0
69 67089 [main] touch 38975 cygheap_user::ontherange: HOME is already in the environment $HOME
346 67435 [main] touch 38975 build_argv: argv[0] = 'C:/.../cygwin64/bin/touch'
44 67479 [main] touch 38975 build_argv: argv[1] = '20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt'
44 67523 [main] touch 38975 build_argv: argc 2
100 67623 [main] touch 38975 mount_info::conv_to_posix_path: conv_to_posix_path (C:/.../cygwin64/bin/touch, 0x10000100, no-add-slash)
43 67666 [main] touch 38975 normalize_win32_path: C:/.../cygwin64/bin/touch = normalize_win32_path (C:/.../cygwin64/bin/touch)
44 67710 [main] touch 38975 mount_info::conv_to_posix_path: /usr/bin/touch = conv_to_posix_path (C:/.../cygwin64/bin/touch)
372 68082 [main] touch 38975 open_shared: name f031669020b3f992-cons0x23D02E6.0, n 0, shared 0x180000000 (wanted 0x180000000), h 0x2BC, *m 3
--- Process 5012 (pid: 38975) loaded C:/Windows/System32/user32.dll at 00007ffbaae30000
--- Process 5012 (pid: 38975) loaded C:/Windows/System32/win32u.dll at 00007ffba9e50000
--- Process 5012 (pid: 38975) loaded C:/Windows/System32/gdi32.dll at 00007ffbab590000
--- Process 5012 (pid: 38975) loaded C:/Windows/System32/gdi32full.dll at 00007ffba97f0000
--- Process 5012 (pid: 38975) loaded C:/Windows/System32/msvcp_win.dll at 00007ffba9bd0000
--- Process 5012 (pid: 38975) loaded C:/Windows/System32/ucrtbase.dll at 00007ffba9e80000
--- Process 5012 (pid: 38975) loaded C:/Windows/System32/imm32.dll at 00007ffbaabe0000
...
599 103030 [main] touch 38975 _pinfo::set_ctty: cygheap->ctty now 0x18035F3F0, archetype 0x18035F3F0
539 103569 [main] touch 38975 __set_errno: void dll_crt0_1(void*):989 setting errno 0
698 104267 [main] touch 38975 __get_lcid_from_locale: LCID=0x1009
112 104379 [main] touch 38975 __get_lcid_from_locale: LCID=0x1009
275 104654 [main] touch 38975 __get_lcid_from_locale: LCID=0x1009
638 105292 [main] touch 38975 __get_lcid_from_locale: LCID=0x1009
420 105712 [main] touch 38975 __get_lcid_from_locale: LCID=0x1009
174 105886 [main] touch 38975 __get_lcid_from_locale: LCID=0x1009
711 106597 [main] touch 38975 open: open(20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt, 0xC201)
54 106651 [main] touch 38975 normalize_posix_path: src 20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt
73 106724 [main] touch 38975 cwdstuff::get: posix $HOME
85 106809 [main] touch 38975 cwdstuff::get: ($HOME) = cwdstuff::get (0x800000010, 32768, 1, 0), errno 0
57 106866 [main] touch 38975 normalize_posix_path: $HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt = normalize_posix_path (20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt)
80 106946 [main] touch 38975 mount_info::conv_to_win32_path: conv_to_win32_path ($HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt)
61 107007 [main] touch 38975 mount_info::cygdrive_win32_path: src '$HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt', dst '$HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt'
53 107060 [main] touch 38975 mount_info::conv_to_win32_path: src_path $HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt, dst $HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt, flags 0x4028, rc 0
62 107122 [main] touch 38975 symlink_info::check: not a symlink
43 107165 [main] touch 38975 symlink_info::check: 0 = symlink.check($HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt, 0xFFFFB670) (mount_flags 0x4028, path_flags 0x0)
386 107551 [main] touch 38975 path_conv::check: this->path($HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt), has_acls(1)
269 107820 [main] touch 38975 __set_errno: fhandler_base* build_fh_name(const char*, unsigned int, suffix_info*):440 setting errno 91
66 107886 [main] touch 38975 open: -1 = open(20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt, 0xC201), errno 91
91 107977 [main] touch 38975 normalize_posix_path: src $HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt
44 108021 [main] touch 38975 normalize_posix_path: $HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt = normalize_posix_path ($HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt)
55 108076 [main] touch 38975 mount_info::conv_to_win32_path: conv_to_win32_path ($HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt)
44 108120 [main] touch 38975 mount_info::cygdrive_win32_path: src '$HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt', dst '$HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt'
47 108167 [main] touch 38975 mount_info::conv_to_win32_path: src_path $HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt, dst $HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt, flags 0x4028, rc 0
48 108215 [main] touch 38975 symlink_info::check: not a symlink
41 108256 [main] touch 38975 symlink_info::check: 0 = symlink.check($HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt, 0xFFFFB6F0) (mount_flags 0x4028, path_flags 0x0)
168 108424 [main] touch 38975 path_conv::check: this->path($HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt), has_acls(1)
45 108469 [main] touch 38975 __set_errno: int utimens_worker(path_conv&, const timespec*):345 setting errno 91
46 108515 [main] touch 38975 utimens_worker: -1 = utimes(/??/$HOME/20210518_9點半蘋果新聞報道 字幕版重溫(2021年5月18日)︱蔡展鵬光顧賣淫骨場 O記轉介律政司︱新巴車長被判不小心駕駛罪成︱深圳賽格大樓離奇劇晃 民眾慌忙逃走︱蘋果日報 Apple Daily #香港新聞.txt, 0x0), errno 91
...
More information about the Cygwin
mailing list