--- 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; } }