From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2210) id 51C5B3857C7F; Sun, 4 Oct 2020 16:54:12 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 51C5B3857C7F Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Ken Brown To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: fix handling of known reparse points that are not symlinks X-Act-Checkin: newlib-cygwin X-Git-Author: Ken Brown X-Git-Refname: refs/heads/master X-Git-Oldrev: 4b4fffe0f2390be6a5be27b6a3ceaa212a3724b2 X-Git-Newrev: 0b4beaf46f34869aa2773c08a658e8aadba496e1 Message-Id: <20201004165412.51C5B3857C7F@sourceware.org> Date: Sun, 4 Oct 2020 16:54:12 +0000 (GMT) X-BeenThere: cygwin-cvs@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Cygwin core component git logs List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 04 Oct 2020 16:54:12 -0000 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=0b4beaf46f34869aa2773c08a658e8aadba496e1 commit 0b4beaf46f34869aa2773c08a658e8aadba496e1 Author: Ken Brown Date: Mon Sep 28 16:34:44 2020 -0400 Cygwin: fix handling of known reparse points that are not symlinks Commit aa467e6e, "Cygwin: add AF_UNIX reparse points to path handling", changed check_reparse_point_target so that it could return a positive value on a known reparse point that is not a symlink. But some of the code in check_reparse_point that handles this positive return value was executed unconditionally, when it should have been executed only for symlinks. As a result, posixify could be called on a buffer containing garbage, and check_reparse_point could erroneously return a positive value on a non-symlink. This is now fixed so that posixify is only called if the reparse point is a symlink, and check_reparse_point returns 0 if the reparse point is not a symlink. Also fix symlink_info::check to handle this last case, in which check_reparse_point returns 0 on a known reparse point. Diff: --- winsup/cygwin/path.cc | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 638f1adce..2e3208d2d 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -2655,11 +2655,15 @@ symlink_info::check_reparse_point (HANDLE h, bool remote) /* ret is > 0, so it's a known reparse point, path in symbuf. */ path_flags |= ret; if (ret & PATH_SYMLINK) - sys_wcstombs (srcbuf, SYMLINK_MAX + 7, symbuf.Buffer, - symbuf.Length / sizeof (WCHAR)); - /* A symlink is never a directory. */ - fileattr &= ~FILE_ATTRIBUTE_DIRECTORY; - return posixify (srcbuf); + { + sys_wcstombs (srcbuf, SYMLINK_MAX + 7, symbuf.Buffer, + symbuf.Length / sizeof (WCHAR)); + /* A symlink is never a directory. */ + fileattr &= ~FILE_ATTRIBUTE_DIRECTORY; + return posixify (srcbuf); + } + else + return 0; } int @@ -3274,6 +3278,9 @@ restart: &= ~FILE_ATTRIBUTE_DIRECTORY; break; } + else if (res == 0 && (path_flags & PATH_REP)) + /* Known reparse point but not a symlink. */ + goto file_not_symlink; else { /* Volume moint point or unrecognized reparse point type.