SECURITY: DKIM DNS buffer overflow protection
[users/heiko/exim.git] / src / OS / os.c-cygwin
index 5459044e528fbf4dd1c7cffa632b4c12e61ebc8c..ea17a436eee23cff44794419e7978496c7d78985 100644 (file)
@@ -1,5 +1,3 @@
-/* $Cambridge: exim/src/OS/os.c-cygwin,v 1.2 2005/03/29 11:01:32 ph10 Exp $ */
-
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 *************************************************/
@@ -49,6 +47,8 @@ unsigned int cygwin_WinVersion;
 #endif
 
 #include <windows.h>
+#define EqualLuid(Luid1, Luid2) \
+  ((Luid1.LowPart == Luid2.LowPart) && (Luid1.HighPart == Luid2.HighPart))
 #include <sys/cygwin.h>
 
 /* Special static variables */
@@ -84,7 +84,7 @@ int cygwin_setgid(gid_t gid )
 }
 
 /* Background processes run at lower priority */
-static void setpriority()
+static void cygwin_setpriority()
 {
   if (!SetPriorityClass(GetCurrentProcess(), BELOW_NORMAL_PRIORITY_CLASS))
     SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);
@@ -130,9 +130,9 @@ static DWORD get_privileges ()
               && GetTokenInformation(hToken, TokenPrivileges,
                                      privs, length, &length)))) {
     for (i = 0; i < privs->PrivilegeCount; i++) {
-      if (privs->Privileges[i].Luid.QuadPart == cluid.QuadPart)
+      if (EqualLuid(privs->Privileges[i].Luid, cluid))
         ret |= CREATE_BIT;
-      else if (privs->Privileges[i].Luid.QuadPart == rluid.QuadPart)
+      else if (EqualLuid(privs->Privileges[i].Luid, rluid))
         ret |= RESTORE_BIT;
       else continue;
       if (ret == (CREATE_BIT | RESTORE_BIT))
@@ -152,7 +152,7 @@ static DWORD get_privileges ()
     cygwin_init is called from the OS_INIT macro in main(). */
 
 void cygwin_init(int argc, char ** argv, void * rup,
-                 void * eup, void * egp, void * cup)
+                 void * eup, void * egp, void * cup, void * cgp)
 {
   int i;
   uid_t myuid, systemuid;
@@ -181,7 +181,7 @@ void cygwin_init(int argc, char ** argv, void * rup,
         fprintf(stderr, " Root / mapped to %s.\n", win32_path);
       }
       else if (argv[i][1] == 'b' && argv[i][2] == 'd')
-        setpriority();
+        cygwin_setpriority();
     }
   }
   if (VERSION_IS_58M(cygwin_WinVersion)) {
@@ -220,9 +220,10 @@ void cygwin_init(int argc, char ** argv, void * rup,
     * (gid_t *) egp = adminsgid;
   }
 
-  /* Set the configuration uid to the system uid.
+  /* Set the configuration uid and gid to the system uid and admins gid.
      Note that exim uid is also accepted as owner of exim.conf. */
   * (uid_t *) cup = systemuid;
+  * (gid_t *) cgp = adminsgid;
 
   if (privileged) {             /* Can setuid */
     if (cygwin_setgid(* (gid_t *) egp) /* Setuid to exim */
@@ -242,8 +243,8 @@ void cygwin_init(int argc, char ** argv, void * rup,
   if (cygwin_debug) {
     fprintf(stderr, "Starting uid %ld, gid %ld, ntsec %lu, privileged %d.\n",
             myuid, mygid, cygwin_internal(CW_CHECK_NTSEC, NULL), privileged);
-    fprintf(stderr, "root_uid %ld, exim_uid %ld, exim_gid %ld, config_uid %ld.\n",
-            * (uid_t *) rup, * (uid_t *) eup, * (gid_t *) egp, * (uid_t *) cup);
+    fprintf(stderr, "root_uid %ld, exim_uid %ld, exim_gid %ld, config_uid %ld, config_gid %ld.\n",
+            * (uid_t *) rup, * (uid_t *) eup, * (gid_t *) egp, * (uid_t *) cup, * (gid_t *) cgp);
   }
   return;
 }