diff options
author | Eric Blake <eblake@redhat.com> | 2009-09-26 15:51:53 +0000 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2009-09-26 15:51:53 +0000 |
commit | 52dba6a5c45e8d8ba1e237a15213311dc11d91fb (patch) | |
tree | 58e8c9e0fea63d08c7f3e63ba3956e3196403d94 /winsup/cygwin/fhandler_disk_file.cc | |
parent | 1e6459d3e5248a8253e73b602615820d14ee6483 (diff) | |
download | cygnal-52dba6a5c45e8d8ba1e237a15213311dc11d91fb.tar.gz cygnal-52dba6a5c45e8d8ba1e237a15213311dc11d91fb.tar.bz2 cygnal-52dba6a5c45e8d8ba1e237a15213311dc11d91fb.zip |
Fix some POSIX-compliance bugs in link, rename, mkdir.
* syscalls.cc (link): Delete obsolete comment. Reject directories
and missing source up front.
(rename): Use correct errno for trailing '.'. Detect empty
strings. Allow trailing slash to newpath iff oldpath is
directory.
* dir.cc (mkdir): Reject dangling symlink with trailing slash.
* fhandler_disk_file.cc (fhandler_disk_file::link): Reject
trailing slash.
* fhandler.cc (fhandler_base::link): Match Linux errno.
Diffstat (limited to 'winsup/cygwin/fhandler_disk_file.cc')
-rw-r--r-- | winsup/cygwin/fhandler_disk_file.cc | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index 214be47b3..99bbf8ba3 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -1186,7 +1186,8 @@ fhandler_disk_file::ftruncate (_off64_t length, bool allow_truncate) int fhandler_disk_file::link (const char *newpath) { - path_conv newpc (newpath, PC_SYM_NOFOLLOW | PC_POSIX, stat_suffixes); + size_t nlen = strlen (newpath); + path_conv newpc (newpath, PC_SYM_NOFOLLOW | PC_POSIX | PC_NULLEMPTY, stat_suffixes); if (newpc.error) { set_errno (newpc.error); @@ -1200,7 +1201,13 @@ fhandler_disk_file::link (const char *newpath) return -1; } - char new_buf[strlen (newpath) + 5]; + if (isdirsep (newpath[nlen - 1]) || has_dot_last_component (newpath, false)) + { + set_errno (ENOENT); + return -1; + } + + char new_buf[nlen + 5]; if (!newpc.error) { if (pc.is_lnk_special ()) |