+2004-12-18 Christopher Faylor <cgf@timesys.com>
+
+ * child_info.h (CURR_CHILD_INFO_MAGIC): Use updated value.
+
+2004-12-18 Christopher Faylor <cgf@timesys.com>
+ Pierre Humblet <pierre.humblet@ieee.org>
+
+ * 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.
+
2004-12-18 Chris January <chris@atomice.net>
* fhandler_proc.cc (proc_listing): Add entry for "self".
#define EXEC_MAGIC_SIZE sizeof(child_info)
-#define CURR_CHILD_INFO_MAGIC 0x694cd4b8U
+#define CURR_CHILD_INFO_MAGIC 0x17ad771aU
/* NOTE: Do not make gratuitous changes to the names or organization of the
below class. The layout is checksummed to determine compatibility between
/* 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
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 ());