* child_info.h (CURR_CHILD_INFO_MAGIC): Use updated value.

* path.cc (path_conv::check): Check the output Win32 path for trailing spaces
and dots, not the input path.  Disallow all use of foo./bar since consistently
getting this right is time consuming.  Remove strange test for "unc\" since no
one seems to know what it's for.
This commit is contained in:
Christopher Faylor
2004-12-19 02:40:40 +00:00
parent bbe009b770
commit 5524af6e9b
3 changed files with 42 additions and 17 deletions

View File

@@ -546,25 +546,12 @@ path_conv::check (const char *src, unsigned opt,
/* Detect if the user was looking for a directory. We have to strip the
trailing slash initially while trying to add extensions but take it
into account during processing */
if (tail > path_copy + 1)
if (tail > path_copy + 1 && isslash (tail[-1]))
{
if (isslash (tail[-1]))
{
need_directory = 1;
tail--;
}
/* Remove trailing dots and spaces which are ignored by Win32 functions but
not by native NT functions. */
while (tail[-1] == '.' || tail[-1] == ' ')
tail--;
if (tail > path_copy + 1 && isslash (tail[-1]))
{
error = ENOENT;
return;
}
need_directory = 1;
*--tail = '\0';
}
path_end = tail;
*tail = '\0';
/* Scan path_copy from right to left looking either for a symlink
or an actual existing file. If an existing file is found, just
@@ -835,6 +822,32 @@ out:
if (dev.devn == FH_FS)
{
if (strncmp (path, "\\\\.\\", 4))
{
/* Windows ignores trailing dots and spaces */
char *tail = NULL;
for (char *p = path; *p; p++)
if (*p != '.' && *p != ' ')
tail = NULL;
else if (p[1] == '\\')
{
error = ENOENT;
return;
}
else if (!tail)
tail = p;
if (!tail)
/* nothing */;
else if (tail[-1] != '\\')
*tail = '\0';
else
{
error = ENOENT;
return;
}
}
if (fs.update (path))
{
debug_printf ("this->path(%s), has_acls(%d)", path, fs.has_acls ());