On Wed, Jul 16, 2008, Noèl Köthe wrote: > I search a bit more in the internet and found as small confirmation > another bug report: http://bugs.gentoo.org/show_bug.cgi?id=225895 > (remove unreproducable tag? of this bug;))
Thanks for the pointer; could you please try the attached patch? Didn't run it myself, I hope it doesn't break anything. :-P Thanks, -- Loïc Minier
Index: debian/changelog =================================================================== --- debian/changelog (révision 2374) +++ debian/changelog (copie de travail) @@ -1,3 +1,10 @@ +dbus (1.2.1-3) UNRELEASED; urgency=low + + * New patch, 60_sysconf-pw-sizes, use sysconf to retrieve the needed size + for getpwnam() and getgrnam() bufs; closes: #489738. + + -- Loic Minier <[EMAIL PROTECTED]> Wed, 23 Jul 2008 03:00:27 +0200 + dbus (1.2.1-2) unstable; urgency=low [ Sjoerd Simons ] Index: debian/patches/60_sysconf-pw-sizes.patch =================================================================== --- debian/patches/60_sysconf-pw-sizes.patch (révision 0) +++ debian/patches/60_sysconf-pw-sizes.patch (révision 0) @@ -0,0 +1,161 @@ +diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c +index 19858dd..7533cc2 100644 +--- a/dbus/dbus-sysdeps-unix.c ++++ b/dbus/dbus-sysdeps-unix.c +@@ -1452,28 +1452,45 @@ fill_user_info (DBusUserInfo *info, + { + struct passwd *p; + int result; +- char buf[1024]; ++ size_t buflen; ++ char *buf; + struct passwd p_str; + ++ /* retrieve maximum needed size for buf */ ++ buflen = sysconf(_SC_GETPW_R_SIZE_MAX); ++ ++ if (buflen <= 0) ++ buflen = 1024; ++ ++ 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), ++ result = getpwuid_r (uid, &p_str, buf, buflen, + &p); + else +- result = getpwnam_r (username_c, &p_str, buf, sizeof (buf), ++ 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)); ++ p = getpwuid_r (uid, &p_str, buf, buflen); + else +- p = getpwnam_r (username_c, &p_str, buf, sizeof (buf)); ++ p = getpwnam_r (username_c, &p_str, buf, buflen); + result = 0; + #endif /* !HAVE_POSIX_GETPWNAM_R */ + 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 +1498,7 @@ fill_user_info (DBusUserInfo *info, + "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 +1515,10 @@ fill_user_info (DBusUserInfo *info, + if (p != NULL) + { + if (!fill_user_info_from_passwd (p, info, error)) +- return FALSE; ++ { ++ dbus_free(buf); ++ return FALSE; ++ } + } + else + { +@@ -1505,6 +1526,7 @@ fill_user_info (DBusUserInfo *info, + "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; + } + } +diff --git a/dbus/dbus-sysdeps-util-unix.c b/dbus/dbus-sysdeps-util-unix.c +index 9ff3fbc..5f0df3f 100644 +--- a/dbus/dbus-sysdeps-util-unix.c ++++ b/dbus/dbus-sysdeps-util-unix.c +@@ -828,31 +828,49 @@ fill_group_info (DBusGroupInfo *info, + { + struct group *g; + int result; +- char buf[1024]; ++ size_t buflen; ++ char *buf; + struct group g_str; ++ dbus_bool_t b; ++ ++ /* retrieve maximum needed size for buf */ ++ buflen = sysconf(_SC_GETGR_R_SIZE_MAX); ++ ++ if (buflen <= 0) ++ buflen = 1024; ++ ++ 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), ++ result = getgrnam_r (group_c_str, &g_str, buf, buflen, + &g); + else +- result = getgrgid_r (gid, &g_str, buf, sizeof (buf), ++ result = getgrgid_r (gid, &g_str, buf, buflen, + &g); + #else +- g = getgrnam_r (group_c_str, &g_str, buf, sizeof (buf)); ++ g = getgrnam_r (group_c_str, &g_str, buf, buflen); + result = 0; + #endif /* !HAVE_POSIX_GETPWNAM_R */ + 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 +883,16 @@ fill_group_info (DBusGroupInfo *info, + + 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; + } + }