• Alex Brainman's avatar
    os: use CreateFile for Stat of symlinks · f1081589
    Alex Brainman authored
    Stat uses Windows FindFirstFile + CreateFile to gather symlink
    information - FindFirstFile determines if file is a symlink,
    and then CreateFile follows symlink to capture target details.
    
    Lstat only uses FindFirstFile.
    
    This CL replaces current approach with just a call to CreateFile.
    Lstat uses FILE_FLAG_OPEN_REPARSE_POINT flag, that instructs
    CreateFile not to follow symlink. Other than that both Stat and
    Lstat look the same now. New code is simpler.
    
    CreateFile + GetFileInformationByHandle (unlike FindFirstFile)
    does not report reparse tag of a file. I tried to ignore reparse
    tag altogether. And it works for symlinks and mount points.
    Unfortunately (see https://github.com/moby/moby/issues/37026),
    files on deduped disk volumes are reported with
    FILE_ATTRIBUTE_REPARSE_POINT attribute set and reparse tag set
    to IO_REPARSE_TAG_DEDUP. So, if we ignore reparse tag, Lstat
    interprets deduped volume files as symlinks. That is incorrect.
    So I had to add GetFileInformationByHandleEx call to gather
    reparse tag after calling CreateFile and GetFileInformationByHandle.
    
    Fixes #27225
    Fixes #27515
    
    Change-Id: If60233bcf18836c147597cc17450d82f3f88c623
    Reviewed-on: https://go-review.googlesource.com/c/143578
    Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
    Reviewed-by: 's avatarKirill Kolyshkin <kolyshkin@gmail.com>
    f1081589
Name
Last commit
Last update
.github Loading commit data...
api Loading commit data...
doc Loading commit data...
lib/time Loading commit data...
misc Loading commit data...
src Loading commit data...
test Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
AUTHORS Loading commit data...
CONTRIBUTING.md Loading commit data...
CONTRIBUTORS Loading commit data...
LICENSE Loading commit data...
PATENTS Loading commit data...
README.md Loading commit data...
favicon.ico Loading commit data...
robots.txt Loading commit data...