Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2009-04-07 20:24:50 +0400
committerCorinna Vinschen <corinna@vinschen.de>2009-04-07 20:24:50 +0400
commit18ac7638b9327d6f7251e7dcc40bbeb4ea52ce4f (patch)
tree42b02c7b79400b433c973905953f44299c6fea11 /winsup/utils/path.cc
parent21c7d001dc4483658021765242d98176c3672d54 (diff)
* path.cc (readlink): Accommodate new UTF-16 symlinks.
Diffstat (limited to 'winsup/utils/path.cc')
-rw-r--r--winsup/utils/path.cc28
1 files changed, 23 insertions, 5 deletions
diff --git a/winsup/utils/path.cc b/winsup/utils/path.cc
index 817c4c874..f296d1df8 100644
--- a/winsup/utils/path.cc
+++ b/winsup/utils/path.cc
@@ -183,7 +183,7 @@ readlink (HANDLE fh, char *path, int maxlen)
if (!GetFileInformationByHandle (fh, &fi)
|| fi.nFileSizeHigh != 0
- || fi.nFileSizeLow > 8192)
+ || fi.nFileSizeLow > 4 * 65536)
return false;
buf = (char *) alloca (fi.nFileSizeLow + 1);
@@ -211,17 +211,35 @@ readlink (HANDLE fh, char *path, int maxlen)
len = *(unsigned short *) cp;
cp += 2;
}
- if (len + 1 > maxlen)
+ if (*(PWCHAR) cp == 0xfeff) /* BOM */
+ {
+ len = wcstombs (NULL, (wchar_t *) (cp + 2), 0);
+ if (len == (size_t) -1 || len + 1 > maxlen)
+ return false;
+ wcstombs (path, (wchar_t *) (cp + 2), len + 1);
+ }
+ else if (len + 1 > maxlen)
return false;
- memcpy (path, cp, len);
+ else
+ memcpy (path, cp, len);
path[len] = '\0';
return true;
}
else if (strncmp (buf, SYMLINK_COOKIE, strlen (SYMLINK_COOKIE)) == 0
- && fi.nFileSizeLow - strlen (SYMLINK_COOKIE) <= (unsigned) maxlen
&& buf[fi.nFileSizeLow - 1] == '\0')
{
- strcpy (path, &buf[strlen (SYMLINK_COOKIE)]);
+ cp = buf + strlen (SYMLINK_COOKIE);
+ if (*(PWCHAR) cp == 0xfeff) /* BOM */
+ {
+ len = wcstombs (NULL, (wchar_t *) (cp + 2), 0);
+ if (len == (size_t) -1 || len + 1 > maxlen)
+ return false;
+ wcstombs (path, (wchar_t *) (cp + 2), len + 1);
+ }
+ else if (fi.nFileSizeLow - strlen (SYMLINK_COOKIE) > (unsigned) maxlen)
+ return false;
+ else
+ strcpy (path, cp);
return true;
}
else