diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2005-09-29 16:23:22 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2005-09-29 16:23:22 +0000 |
commit | f6c9ff6646a97ad4dd45ebdf755d4eb73fe5b6a5 (patch) | |
tree | ad572005626fe141e487dc98b783921d9d0d3854 /winsup | |
parent | 9a7b0aad2ade1e0f3d0450118861d7bc52f344c0 (diff) | |
download | newlib-f6c9ff6646a97ad4dd45ebdf755d4eb73fe5b6a5.zip newlib-f6c9ff6646a97ad4dd45ebdf755d4eb73fe5b6a5.tar.gz newlib-f6c9ff6646a97ad4dd45ebdf755d4eb73fe5b6a5.tar.bz2 |
* dir.cc (mkdir): Check for trailing /. or /.. component.
(rmdir): Ditto.
* path.cc (has_dot_last_component): New function.
* path.h (has_dot_last_component): Add declaration.
Diffstat (limited to 'winsup')
-rw-r--r-- | winsup/cygwin/dir.cc | 20 | ||||
-rw-r--r-- | winsup/cygwin/path.cc | 18 | ||||
-rw-r--r-- | winsup/cygwin/path.h | 1 |
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))); |