• 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
..
bytealg Loading commit data...
cpu Loading commit data...
fmtsort Loading commit data...
goroot Loading commit data...
nettrace Loading commit data...
poll Loading commit data...
race Loading commit data...
singleflight Loading commit data...
syscall Loading commit data...
testenv Loading commit data...
testlog Loading commit data...
trace Loading commit data...
traceparser Loading commit data...