--- dbus-1.2.1/dbus/dbus-sysdeps-unix.c	2008-04-04 15:24:08.000000000 +0000
+++ dbus-1.2.1.patched/dbus/dbus-sysdeps-unix.c	2008-07-27 11:44:35.000000000 +0000
@@ -1452,28 +1452,59 @@
   {
     struct passwd *p;
     int result;
-    char buf[1024];
+    size_t buflen;
+    char *buf;
     struct passwd p_str;
 
-    p = NULL;
+    /* retrieve maximum needed size for buf */
+    buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
+
+    if (buflen <= 0)
+      buflen = 1024;
+
+    result = -1;
+    while(1)
+      {
+        buf = dbus_malloc(buflen);
+        if (buf == NULL)
+          {
+            dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
+            return FALSE;
+          }
+
+        p = NULL;
 #ifdef HAVE_POSIX_GETPWNAM_R
-    if (uid != DBUS_UID_UNSET)
-      result = getpwuid_r (uid, &p_str, buf, sizeof (buf),
-                           &p);
-    else
-      result = getpwnam_r (username_c, &p_str, buf, sizeof (buf),
-                           &p);
+        if (uid != DBUS_UID_UNSET)
+          result = getpwuid_r (uid, &p_str, buf, buflen,
+                               &p);
+        else
+          result = getpwnam_r (username_c, &p_str, buf, buflen,
+                               &p);
 #else
-    if (uid != DBUS_UID_UNSET)
-      p = getpwuid_r (uid, &p_str, buf, sizeof (buf));
-    else
-      p = getpwnam_r (username_c, &p_str, buf, sizeof (buf));
-    result = 0;
+        if (uid != DBUS_UID_UNSET)
+          p = getpwuid_r (uid, &p_str, buf, buflen);
+        else
+          p = getpwnam_r (username_c, &p_str, buf, buflen);
+        result = 0;
 #endif /* !HAVE_POSIX_GETPWNAM_R */
+        //Try a bigger buffer if ERANGE was returned
+        if (result == ERANGE && buflen < 512 * 1024)
+          {
+            dbus_free(buf);
+            buflen *= 2;
+          }
+        else
+          {
+            break;
+          }
+      }
     if (result == 0 && p == &p_str)
       {
         if (!fill_user_info_from_passwd (p, info, error))
-          return FALSE;
+          {
+            dbus_free(buf);
+            return FALSE;
+          }
       }
     else
       {
@@ -1481,6 +1512,7 @@
                         "User \"%s\" unknown or no memory to allocate password entry\n",
                         username_c ? username_c : "???");
         _dbus_verbose ("User %s unknown\n", username_c ? username_c : "???");
+        dbus_free(buf);
         return FALSE;
       }
   }
@@ -1497,7 +1529,10 @@
     if (p != NULL)
       {
         if (!fill_user_info_from_passwd (p, info, error))
-          return FALSE;
+          {
+            dbus_free(buf);
+            return FALSE;
+          }
       }
     else
       {
@@ -1505,6 +1540,7 @@
                         "User \"%s\" unknown or no memory to allocate password entry\n",
                         username_c ? username_c : "???");
         _dbus_verbose ("User %s unknown\n", username_c ? username_c : "???");
+        dbus_free(buf);
         return FALSE;
       }
   }
--- dbus-1.2.1/dbus/dbus-sysdeps-util-unix.c	2008-04-04 15:24:08.000000000 +0000
+++ dbus-1.2.1.patched/dbus/dbus-sysdeps-util-unix.c	2008-07-27 11:50:53.000000000 +0000
@@ -828,31 +828,64 @@
   {
     struct group *g;
     int result;
-    char buf[1024];
+    size_t buflen;
+    char *buf;
     struct group g_str;
+    dbus_bool_t b;
 
-    g = NULL;
+    /* retrieve maximum needed size for buf */
+    buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
+
+    if (buflen <= 0)
+      buflen = 1024;
+
+    result = -1;
+    while (1)
+      {
+        buf = dbus_malloc(buflen);
+        if (buf == NULL)
+          {
+            dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
+            return FALSE;
+          }
+
+        g = NULL;
 #ifdef HAVE_POSIX_GETPWNAM_R
 
-    if (group_c_str)
-      result = getgrnam_r (group_c_str, &g_str, buf, sizeof (buf),
-                           &g);
-    else
-      result = getgrgid_r (gid, &g_str, buf, sizeof (buf),
-                           &g);
+        if (group_c_str)
+          result = getgrnam_r (group_c_str, &g_str, buf, buflen,
+                               &g);
+        else
+          result = getgrgid_r (gid, &g_str, buf, buflen,
+                               &g);
 #else
-    g = getgrnam_r (group_c_str, &g_str, buf, sizeof (buf));
-    result = 0;
+        g = getgrnam_r (group_c_str, &g_str, buf, buflen);
+        result = 0;
 #endif /* !HAVE_POSIX_GETPWNAM_R */
+        //Try a bigger buffer if ERANGE was returned
+        if (result == ERANGE && buflen < 512 * 1024)
+          {
+            dbus_free(buf);
+            buflen *= 2;
+          }
+        else
+          {
+            break;
+          }
+      }
+
     if (result == 0 && g == &g_str)
       {
-        return fill_user_info_from_group (g, info, error);
+        b = fill_user_info_from_group (g, info, error);
+        dbus_free(buf);
+        return b;
       }
     else
       {
         dbus_set_error (error, _dbus_error_from_errno (errno),
                         "Group %s unknown or failed to look it up\n",
                         group_c_str ? group_c_str : "???");
+        dbus_free(buf);
         return FALSE;
       }
   }
@@ -865,13 +898,16 @@
 
     if (g != NULL)
       {
-        return fill_user_info_from_group (g, info, error);
+        b = fill_user_info_from_group (g, info, error);
+        dbus_free(buf);
+        return b;
       }
     else
       {
         dbus_set_error (error, _dbus_error_from_errno (errno),
                         "Group %s unknown or failed to look it up\n",
                         group_c_str ? group_c_str : "???");
+        dbus_free(buf);
         return FALSE;
       }
   }