summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/path.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/path.cc')
-rw-r--r--winsup/cygwin/path.cc31
1 files changed, 19 insertions, 12 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 92611d7b1..1c7c554af 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -2399,6 +2399,19 @@ symlink (const char *topath, const char *frompath)
DWORD written;
SECURITY_ATTRIBUTES sa = sec_none_nih;
+ /* POSIX says that empty 'frompath' is invalid input whlie empty
+ 'topath' is valid -- it's symlink resolver job to verify if
+ symlink contents point to existing filesystem object */
+ if (check_null_empty_str_errno (topath) == EFAULT ||
+ check_null_empty_str_errno (frompath))
+ goto done;
+
+ if (strlen (topath) >= MAX_PATH)
+ {
+ set_errno (ENAMETOOLONG);
+ goto done;
+ }
+
win32_path.check (frompath, PC_SYM_NOFOLLOW);
if (allow_winsymlinks && !win32_path.error)
{
@@ -2415,17 +2428,6 @@ symlink (const char *topath, const char *frompath)
syscall_printf ("symlink (%s, %s)", topath, win32_path.get_win32 ());
- if (topath[0] == 0)
- {
- set_errno (EINVAL);
- goto done;
- }
- if (strlen (topath) >= MAX_PATH)
- {
- set_errno (ENAMETOOLONG);
- goto done;
- }
-
if (win32_path.is_device () ||
win32_path.file_attributes () != (DWORD) -1)
{
@@ -2984,7 +2986,12 @@ hashit:
char *
getcwd (char *buf, size_t ulen)
{
- return cygheap->cwd.get (buf, 1, 1, ulen);
+ char* res = NULL;
+ if (ulen == 0)
+ set_errno (EINVAL);
+ else if (!__check_null_invalid_struct_errno (buf, ulen))
+ res = cygheap->cwd.get (buf, 1, 1, ulen);
+ return res;
}
/* getwd: standards? */