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