• 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
symlink_windows.go 1.58 KB