* path.cc (readlink): Accommodate new UTF-16 symlinks.

This commit is contained in:
Corinna Vinschen 2009-04-07 16:24:50 +00:00
parent 21c7d001dc
commit 18ac7638b9
2 changed files with 27 additions and 5 deletions

View File

@ -1,3 +1,7 @@
2009-04-07 Corinna Vinschen <corinna@vinschen.de>
* path.cc (readlink): Accommodate new UTF-16 symlinks.
2009-04-03 Kevin Buettner <kevinb@redhat.com>
* utils.sgml: Various syntactical and semantical fixes.

View File

@ -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;
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