Handle multiple user names with the same UID better. (#319535, Laszlo
authorMatthias Clasen <mclasen@redhat.com>
Sun, 4 Dec 2005 07:00:50 +0000 (07:00 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Sun, 4 Dec 2005 07:00:50 +0000 (07:00 +0000)
2005-12-04  Matthias Clasen  <mclasen@redhat.com>

Handle multiple user names with the same UID better.
(#319535, Laszlo Peter)

* glib/gutils.c (g_get_any_init_do): When determining user
data, first look up $LOGNAME. If the UID doesn't match
getuid(), fall back to the current behaviour of looking
up the user data based on getuid().

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-12
glib/gutils.c

index 62683bc..54fd9a7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2005-12-04  Matthias Clasen  <mclasen@redhat.com>
 
+       Handle multiple user names with the same UID better.
+       (#319535, Laszlo Peter)
+       
+       * glib/gutils.c (g_get_any_init_do): When determining user
+       data, first look up $LOGNAME. If the UID doesn't match
+       getuid(), fall back to the current behaviour of looking
+       up the user data based on getuid().
+
+2005-12-04  Matthias Clasen  <mclasen@redhat.com>
+
        * glib/gmacros.h (G_GNUC_WARN_UNUSED_RESULT): Add a macro
        to make gcc warn if a function result is ignored.  (#145466,
        Arjan van de Ven, Alex Larsson)
index 62683bc..54fd9a7 100644 (file)
@@ -1,5 +1,15 @@
 2005-12-04  Matthias Clasen  <mclasen@redhat.com>
 
+       Handle multiple user names with the same UID better.
+       (#319535, Laszlo Peter)
+       
+       * glib/gutils.c (g_get_any_init_do): When determining user
+       data, first look up $LOGNAME. If the UID doesn't match
+       getuid(), fall back to the current behaviour of looking
+       up the user data based on getuid().
+
+2005-12-04  Matthias Clasen  <mclasen@redhat.com>
+
        * glib/gmacros.h (G_GNUC_WARN_UNUSED_RESULT): Add a macro
        to make gcc warn if a function result is ignored.  (#145466,
        Arjan van de Ven, Alex Larsson)
index 62683bc..54fd9a7 100644 (file)
@@ -1,5 +1,15 @@
 2005-12-04  Matthias Clasen  <mclasen@redhat.com>
 
+       Handle multiple user names with the same UID better.
+       (#319535, Laszlo Peter)
+       
+       * glib/gutils.c (g_get_any_init_do): When determining user
+       data, first look up $LOGNAME. If the UID doesn't match
+       getuid(), fall back to the current behaviour of looking
+       up the user data based on getuid().
+
+2005-12-04  Matthias Clasen  <mclasen@redhat.com>
+
        * glib/gmacros.h (G_GNUC_WARN_UNUSED_RESULT): Add a macro
        to make gcc warn if a function result is ignored.  (#145466,
        Arjan van de Ven, Alex Larsson)
index ced2010..8937d02 100644 (file)
@@ -1555,7 +1555,8 @@ g_get_any_init_do (void)
     struct passwd *pw = NULL;
     gpointer buffer = NULL;
     gint error;
-    
+    gchar *logname;
+
 #  if defined (HAVE_POSIX_GETPWUID_R) || defined (HAVE_NONPOSIX_GETPWUID_R)
     struct passwd pwd;
 #    ifdef _SC_GETPW_R_SIZE_MAX  
@@ -1567,7 +1568,9 @@ g_get_any_init_do (void)
 #    else /* _SC_GETPW_R_SIZE_MAX */
     glong bufsize = 64;
 #    endif /* _SC_GETPW_R_SIZE_MAX */
-    
+
+    logname = (gchar *) g_getenv ("LOGNAME");
+        
     do
       {
        g_free (buffer);
@@ -1578,7 +1581,15 @@ g_get_any_init_do (void)
        errno = 0;
        
 #    ifdef HAVE_POSIX_GETPWUID_R
-       error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);
+       if (logname) {
+         error = getpwnam_r (logname, &pwd, buffer, bufsize, &pw);
+         if (!pw || (pw->pw_uid != getuid ())) {
+           /* LOGNAME is lying, fall back to looking up the uid */
+           error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);
+         }
+       } else {
+         error = getpwuid_r (getuid (), &pwd, buffer, bufsize, &pw);
+       }
        error = error < 0 ? errno : error;
 #    else /* HAVE_NONPOSIX_GETPWUID_R */
    /* HPUX 11 falls into the HAVE_POSIX_GETPWUID_R case */
@@ -1586,7 +1597,15 @@ g_get_any_init_do (void)
        error = getpwuid_r (getuid (), &pwd, buffer, bufsize);
        pw = error == 0 ? &pwd : NULL;
 #      else /* !_AIX */
-       pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);
+       if (logname) {
+         pw = getpwnam_r (logname, &pwd, buffer, bufsize);
+         if (!pw || (pw->pw_uid != getuid ())) {
+           /* LOGNAME is lying, fall back to looking up the uid */
+           pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);
+         }
+       } else {
+         pw = getpwuid_r (getuid (), &pwd, buffer, bufsize);
+       }
        error = pw ? 0 : errno;
 #      endif /* !_AIX */            
 #    endif /* HAVE_NONPOSIX_GETPWUID_R */