OSDN Git Service

* path.cc (symlink): Check arguments for validity.
authorduda <duda>
Sun, 16 Sep 2001 14:26:11 +0000 (14:26 +0000)
committerduda <duda>
Sun, 16 Sep 2001 14:26:11 +0000 (14:26 +0000)
(getcwd): Ditto.
* syscalls.cc (ftruncate): Ditto.
* times.cc (times): Ditto.
* uname.cc (uname): Ditto.

winsup/cygwin/ChangeLog
winsup/cygwin/path.cc
winsup/cygwin/syscalls.cc
winsup/cygwin/times.cc
winsup/cygwin/uname.cc

index ff8cc18..9f611e7 100644 (file)
@@ -1,3 +1,11 @@
+2001-09-16  Egor Duda  <deo@logos-m.ru>
+
+       * path.cc (symlink): Check arguments for validity.
+       (getcwd): Ditto.
+       * syscalls.cc (ftruncate): Ditto.
+       * times.cc (times): Ditto.
+       * uname.cc (uname): Ditto.
+
 Sat Sep 15 22:54:49 2001  Christopher Faylor <cgf@cygnus.com>
 
        * net.cc (dup_servent_ptr): Detect old Windows 95 misaligned structure
index 92611d7..1c7c554 100644 (file)
@@ -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? */
index d6ef25c..1453f4f 100644 (file)
@@ -1768,7 +1768,11 @@ ftruncate (int fd, off_t length)
   sigframe thisframe (mainthread);
   int res = -1;
 
-  if (cygheap->fdtab.not_open (fd))
+  if (length < 0)
+    {
+      set_errno (EINVAL);
+    }
+  else if (cygheap->fdtab.not_open (fd))
     {
       set_errno (EBADF);
     }
index ee5fe5f..e5635dd 100644 (file)
@@ -52,6 +52,9 @@ times (struct tms * buf)
 {
   FILETIME creation_time, exit_time, kernel_time, user_time;
 
+  if (check_null_invalid_struct_errno (buf))
+    return ((clock_t) -1);
+
   DWORD ticks = GetTickCount ();
   /* Ticks is in milliseconds, convert to our ticks. Use long long to prevent
      overflow. */
index 054033a..b73dc97 100644 (file)
@@ -21,6 +21,10 @@ uname (struct utsname *name)
 {
   DWORD len;
   SYSTEM_INFO sysinfo;
+
+  if (check_null_invalid_struct_errno (name))
+    return -1;
+    
   char *snp = strstr  (cygwin_version.dll_build_date, "SNP");
 
   memset (name, 0, sizeof (*name));