{Patch]: Giving access to pinfo after seteuid and exec

Pierre A. Humblet pierre@phumblet.no-ip.org
Fri Sep 26 01:56:00 GMT 2003


This patch sets the _pinfo acl in order to allow access after 
seteuid and exec.

While looking at spawn.cc I also noticed oddities in pinfo related
error handling, and reworked them. I also restored impersonation in
case of CreateProcessAsUser failure.

Pierre

2003-09-25  Pierre Humblet <pierre.humblet@ieee.org>

	* pinfo.h (pinfo::set_acl): Declare.
	* pinfo.cc (pinfo_fixup_after_fork): Duplicate with no rights.
	(pinfo::set_acl): New.
	* spawn.cc (spawn_guts): Call myself.set_acl. Always reimpersonate
	after errors. Fix pinfo related error cases. 
-------------- next part --------------
Index: pinfo.h
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/pinfo.h,v
retrieving revision 1.52
diff -u -p -r1.52 pinfo.h
--- pinfo.h	25 Sep 2003 00:37:17 -0000	1.52
+++ pinfo.h	26 Sep 2003 00:57:08 -0000
@@ -176,6 +176,7 @@ public:
   }
 #endif
   HANDLE shared_handle () {return h;}
+  void set_acl();
 };

 #define ISSTATE(p, f)	(!!((p)->process_state & f))
Index: pinfo.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/pinfo.cc,v
retrieving revision 1.88
diff -u -p -r1.88 pinfo.cc
--- pinfo.cc	25 Sep 2003 00:37:17 -0000	1.88
+++ pinfo.cc	26 Sep 2003 00:57:09 -0000
@@ -30,6 +30,7 @@ details. */
 #include "shared_info.h"
 #include "cygheap.h"
 #include "fhandler.h"
+#include <aclapi.h>

 static char NO_COPY pinfo_dummy[sizeof (_pinfo)] = {0};

@@ -42,9 +43,9 @@ pinfo_fixup_after_fork ()
 {
   if (hexec_proc)
     CloseHandle (hexec_proc);
-
+  /* Keeps the cygpid from being reused. No rights required */
   if (!DuplicateHandle (hMainProc, hMainProc, hMainProc, &hexec_proc, 0,
-			TRUE, DUPLICATE_SAME_ACCESS))
+			TRUE, 0))
     {
       system_printf ("couldn't save current process handle %p, %E", hMainProc);
       hexec_proc = NULL;
@@ -236,6 +237,22 @@ pinfo::init (pid_t n, DWORD flag, HANDLE
       break;
     }
   destroy = 1;
+}
+
+void
+pinfo::set_acl()
+{
+  char sa_buf[1024];
+  SECURITY_DESCRIPTOR sd;
+
+  sec_acl ((PACL) sa_buf, true, true, cygheap->user.sid (),
+	   well_known_world_sid, FILE_MAP_READ | FILE_MAP_READ); /* FIXME */
+  if (!InitializeSecurityDescriptor( &sd, SECURITY_DESCRIPTOR_REVISION))
+    debug_printf("InitializeSecurityDescriptor %E");
+  else if (!SetSecurityDescriptorDacl(&sd, TRUE, (PACL) sa_buf, FALSE))
+    debug_printf("SetSecurityDescriptorDacl %E");
+  else if (!SetKernelObjectSecurity(h, DACL_SECURITY_INFORMATION, &sd))
+    debug_printf ("SetKernelObjectSecurity %E");
 }

 bool
Index: spawn.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/spawn.cc,v
retrieving revision 1.132
diff -u -p -r1.132 spawn.cc
--- spawn.cc	25 Sep 2003 13:49:21 -0000	1.132
+++ spawn.cc	26 Sep 2003 00:57:11 -0000
@@ -672,7 +672,9 @@ spawn_guts (const char * prog_arg, const
   else
     {
       PSID sid = cygheap->user.sid ();
-
+      /* Give access to myself */
+      if (mode == _P_OVERLAY)
+	myself.set_acl();
       /* Set security attributes with sid */
       PSECURITY_ATTRIBUTES sec_attribs = sec_user_nih (sa_buf, sid);

@@ -711,7 +713,7 @@ spawn_guts (const char * prog_arg, const

   /* Restore impersonation. In case of _P_OVERLAY this isn't
      allowed since it would overwrite child data. */
-  if (mode != _P_OVERLAY)
+  if (mode != _P_OVERLAY || !rc)
       cygheap->user.reimpersonate ();

   MALLOC_CHECK;
@@ -788,16 +790,20 @@ spawn_guts (const char * prog_arg, const
     {
       myself->set_has_pgid_children ();
       ProtectHandle (pi.hThread);
-      pinfo child (cygpid, 1);
+      pinfo child (cygpid, PID_IN_USE);
       if (!child)
 	{
-	  set_errno (EAGAIN);
-	  syscall_printf ("-1 = spawnve (), process table full");
+	  syscall_printf ("-1 = spawnve (), failed pinfo");
 	  return -1;
 	}
       child->dwProcessId = pi.dwProcessId;
       child->hProcess = pi.hProcess;
-      child.remember ();
+      if (!child.remember ())
+	{
+	  set_errno (EAGAIN);
+	  syscall_printf ("-1 = spawnve (), process table full");
+	  return -1;
+	}
       strcpy (child->progname, real_path);
       /* FIXME: This introduces an unreferenced, open handle into the child.
 	 The purpose is to keep the pid shared memory open so that all of


More information about the Cygwin-patches mailing list