aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/dir.cc20
-rw-r--r--winsup/cygwin/path.cc18
-rw-r--r--winsup/cygwin/path.h1
3 files changed, 39 insertions, 0 deletions
diff --git a/winsup/cygwin/dir.cc b/winsup/cygwin/dir.cc
index bbb4ca1..c6b318e 100644
--- a/winsup/cygwin/dir.cc
+++ b/winsup/cygwin/dir.cc
@@ -255,6 +255,16 @@ mkdir (const char *dir, mode_t mode)
int res = -1;
fhandler_base *fh = NULL;
+ myfault efault;
+ if (efault.faulted (EFAULT))
+ return -1;
+
+ if (has_dot_last_component (dir))
+ {
+ set_errno (ENOENT);
+ return -1;
+ }
+
if (!(fh = build_fh_name (dir, NULL, PC_SYM_NOFOLLOW | PC_WRITABLE)))
goto done; /* errno already set */;
@@ -279,6 +289,16 @@ rmdir (const char *dir)
int res = -1;
fhandler_base *fh = NULL;
+ myfault efault;
+ if (efault.faulted (EFAULT))
+ return -1;
+
+ if (has_dot_last_component (dir))
+ {
+ set_errno (EINVAL);
+ return -1;
+ }
+
if (!(fh = build_fh_name (dir, NULL, PC_SYM_NOFOLLOW | PC_WRITABLE)))
goto done; /* errno already set */;
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 6b1e44c..c948eec 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -205,6 +205,24 @@ pathmatch (const char *path1, const char *path2)
: strcasematch (path1, path2);
}
+/* TODO: This function is used in mkdir and rmdir to generate correct
+ error messages in case of paths ending in /. or /.. components.
+ This test should eventually end up in path_conv::check in one way
+ or another. Right now, normalize_posix_path will just normalize
+ those components away, which changes the semantics. */
+bool
+has_dot_last_component (const char *dir)
+{
+ /* SUSv3: . and .. are not allowed as last components in various system
+ calls. Don't test for backslash path separator since that's a Win32
+ path following Win32 rules. */
+ const char *last_comp = strrchr (dir, '/');
+ return last_comp
+ && last_comp[1] == '.'
+ && (last_comp[2] == '\0'
+ || (last_comp[2] == '.' && last_comp[3] == '\0'));
+}
+
#define isslash(c) ((c) == '/')
/* Normalize a POSIX path.
diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h
index de37ff2..c353585 100644
--- a/winsup/cygwin/path.h
+++ b/winsup/cygwin/path.h
@@ -289,6 +289,7 @@ has_exec_chars (const char *buf, int len)
int pathmatch (const char *path1, const char *path2) __attribute__ ((regparm (2)));
int pathnmatch (const char *path1, const char *path2, int len) __attribute__ ((regparm (2)));
+bool has_dot_last_component (const char *dir) __attribute__ ((regparm (1)));
bool fnunmunge (char *, const char *) __attribute__ ((regparm (2)));