• 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
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
context Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
plugin Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testdata Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang_org/x Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
cmp.bash Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...