]> sourceware.org Git - newlib-cygwin.git/commitdiff
* dir.cc (rmdir): Streamline. Detect attempts to remove directories from
authorChristopher Faylor <me@cgf.cx>
Wed, 5 Jun 2002 16:01:55 +0000 (16:01 +0000)
committerChristopher Faylor <me@cgf.cx>
Wed, 5 Jun 2002 16:01:55 +0000 (16:01 +0000)
"read-only" virtual devices.  (Suggested by Pavel Tsekov)
* syscalls.cc (unlink): Detect attempts to remove directories from "read-only"
virtual devices.  (From Pavel Tsekov)

winsup/cygwin/ChangeLog
winsup/cygwin/dir.cc
winsup/cygwin/syscalls.cc

index 022f4190d07d12756c7d3bf0e86ba54316dae71b..958c5d3d1d5ea129f60e68270bbbfc0f37a14954 100644 (file)
@@ -1,3 +1,10 @@
+2002-06-05  Christopher Faylor  <cgf@redhat.com>
+
+       * dir.cc (rmdir): Streamline.  Detect attempts to remove directories
+       from "read-only" virtual devices. (Suggested by Pavel Tsekov)
+       * syscalls.cc (unlink): Detect attempts to remove directories
+        from "read-only" virtual devices.  (From Pavel Tsekov)
+
 2002-06-05  Christopher Faylor  <cgf@redhat.com>
 
        * dtable.cc (handle_to_fn): Check error return value from NtQueryObject
@@ -61,7 +68,7 @@
 2002-06-04  Christopher Faylor  <cgf@redhat.com>
 
        * dtable.cc (handle_to_fn): Correct placement and length of name
-       buffer. (Suggested by Pavel Tsekov)
+       buffer.  (Suggested by Pavel Tsekov)
 
 2002-06-04  Christopher Faylor  <cgf@redhat.com>
 
index c9509b65a8fe2640fb118e9da06fb9523d6b155f..45ba57ff674af4c181da82a691cbef4190ed32ce 100644 (file)
@@ -273,24 +273,19 @@ extern "C" int
 rmdir (const char *dir)
 {
   int res = -1;
+  DWORD devn;
 
   path_conv real_dir (dir, PC_SYM_NOFOLLOW);
 
   if (real_dir.error)
-    {
-      set_errno (real_dir.error);
-      res = -1;
-    }
+    set_errno (real_dir.error);
+  else if ((devn = real_dir.get_devn ()) == FH_PROC || devn == FH_REGISTRY
+          || devn == FH_PROCESS)
+    set_errno (EROFS);
   else if (!real_dir.exists ())
-    {
-      set_errno (ENOENT);
-      res = -1;
-    }
+    set_errno (ENOENT);
   else if  (!real_dir.isdir ())
-    {
-      set_errno (ENOTDIR);
-      res = -1;
-    }
+    set_errno (ENOTDIR);
   else
     {
       /* Even own directories can't be removed if R/O attribute is set. */
@@ -330,22 +325,20 @@ rmdir (const char *dir)
              else if ((res = rmdir (dir)))
                SetCurrentDirectory (cygheap->cwd.win32);
            }
-         if (GetLastError () == ERROR_ACCESS_DENIED)
+         if (res)
            {
-
-             /* On 9X ERROR_ACCESS_DENIED is returned if you try to remove
-                a non-empty directory. */
-             if (wincap.access_denied_on_delete ())
-               set_errno (ENOTEMPTY);
-             else
+             if (GetLastError () != ERROR_ACCESS_DENIED
+                 || !wincap.access_denied_on_delete ())
                __seterrno ();
-           }
-         else
-           __seterrno ();
+             else
+               set_errno (ENOTEMPTY);  /* On 9X ERROR_ACCESS_DENIED is
+                                              returned if you try to remove a
+                                              non-empty directory. */
 
-         /* If directory still exists, restore R/O attribute. */
-         if (real_dir.has_attribute (FILE_ATTRIBUTE_READONLY))
-           SetFileAttributes (real_dir, real_dir);
+             /* If directory still exists, restore R/O attribute. */
+             if (real_dir.has_attribute (FILE_ATTRIBUTE_READONLY))
+               SetFileAttributes (real_dir, real_dir);
+           }
        }
     }
 
index 9e28d104e768fc52ce1f1d2a8043d6b1b06d040d..bf2709d06724bceb43316820d24565a13672b9df 100644 (file)
@@ -94,6 +94,7 @@ extern "C" int
 _unlink (const char *ourname)
 {
   int res = -1;
+  DWORD devn;
   sigframe thisframe (mainthread);
 
   path_conv win32_name (ourname, PC_SYM_NOFOLLOW | PC_FULL);
@@ -104,6 +105,13 @@ _unlink (const char *ourname)
       goto done;
     }
 
+  if ((devn = win32_name.get_devn ()) == FH_PROC || devn == FH_REGISTRY
+      || devn == FH_PROCESS)
+    {
+      set_errno (EROFS);
+      goto done;
+    }
+
   syscall_printf ("_unlink (%s)", win32_name.get_win32 ());
 
   if (!win32_name.exists ())
This page took 0.039459 seconds and 5 git commands to generate.