projects
/
mono.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[runtime] Initialize the class name cache using double checked locking.
[mono.git]
/
mono
/
io-layer
/
security.c
diff --git
a/mono/io-layer/security.c
b/mono/io-layer/security.c
index 79f2ba34bddc26b5bb9fead6bf748651437a689d..d1bf3d0362c5b355311ab9af67c9c7c636872383 100644
(file)
--- a/
mono/io-layer/security.c
+++ b/
mono/io-layer/security.c
@@
-10,54
+10,44
@@
#include <config.h>
#include <mono/io-layer/io-layer.h>
#include <config.h>
#include <mono/io-layer/io-layer.h>
+#ifdef HAVE_PWD_H
#include <pwd.h>
#include <pwd.h>
+#endif
+
#include <string.h>
#include <sys/types.h>
#include <string.h>
#include <sys/types.h>
+#include <sys/stat.h>
#include <unistd.h>
#include <unistd.h>
+gboolean
+ImpersonateLoggedOnUser (gpointer handle)
+{
+ uid_t token = (uid_t) GPOINTER_TO_INT (handle);
+#ifdef HAVE_SETRESUID
+ if (setresuid (-1, token, getuid ()) < 0)
+ return FALSE;
+#endif
+ return (geteuid () == token);
+}
+
-gboolean
-GetUserName (gchar *buffer, gint32 *size)
+gboolean RevertToSelf (void)
{
{
-#ifdef HAVE_GETPWUID_R
- struct passwd *pbuf;
- size_t fbufsize;
- gchar *fbuf;
+#ifdef HAVE_GETRESUID
+ uid_t ruid, euid;
#endif
#endif
- struct passwd *p;
- uid_t uid;
+ uid_t suid = -1;
- if (!size) {
- SetLastError (ERROR_INVALID_PARAMETER);
+#ifdef HAVE_GETRESUID
+ if (getresuid (&ruid, &euid, &suid) < 0)
return FALSE;
return FALSE;
- }
-
- uid = getuid ();
-#ifdef HAVE_GETPWUID_R
- fbufsize = (size_t) sysconf (_SC_GETPW_R_SIZE_MAX);
- fbuf = g_malloc0 (fbufsize);
- pbuf = g_new0 (struct passwd, 1);
- getpwuid_r (uid, pbuf, fbuf, fbufsize, &p);
-#else
- p = getpwuid (uid);
#endif
#endif
- if (p) {
- gint32 sz = strlen (p->pw_name);
- if (buffer) {
- if (sz > *size)
- sz = *size;
- strncpy (buffer, p->pw_name, sz);
- }
- *size = sz;
- return TRUE;
- }
-
-#ifdef HAVE_GETPWUID_R
- g_free (pbuf);
- g_free (fbuf);
+#ifdef HAVE_SETRESUID
+ if (setresuid (-1, suid, -1) < 0)
+ return FALSE;
+#else
+ return TRUE;
#endif
#endif
- *size = 0;
- SetLastError (ERROR_INVALID_HANDLE);
- return FALSE;
+ return (geteuid () == suid);
}
}