X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=src%2FOS%2Fos.c-cygwin;h=ea17a436eee23cff44794419e7978496c7d78985;hb=061b7ebd7d69db7674f03025d552fa0bedd0fef8;hp=5459044e528fbf4dd1c7cffa632b4c12e61ebc8c;hpb=8c8415232d289e3dcef4b06bc9a69b704813494f;p=exim.git diff --git a/src/OS/os.c-cygwin b/src/OS/os.c-cygwin index 5459044e5..ea17a436e 100644 --- a/src/OS/os.c-cygwin +++ b/src/OS/os.c-cygwin @@ -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 +#define EqualLuid(Luid1, Luid2) \ + ((Luid1.LowPart == Luid2.LowPart) && (Luid1.HighPart == Luid2.HighPart)) #include /* 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; }