Hi, determines the maximum needed buffersize for getgrnam_r using sysconf instead of hardcoding it to 1024 and increases the buffer on ERANGE. The latter is needed since sysconf is allowed to return -1. Furthermore some glibc versions seem to return a too small buffer on amd64 (http://bugs.debian.org/520744). O.k. to apply? Cheers, -- Guido
>From b0f965f3fbc39040569e07097e9461b7b3224022 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Guido=20G=C3=BCnther?= <agx@xxxxxxxxxxx> Date: Tue, 14 Apr 2009 18:08:16 +0200 Subject: [PATCH] increase buffer on ERANGE --- qemud/qemud.c | 27 +++++++++++++++++++++++++-- 1 files changed, 25 insertions(+), 2 deletions(-) diff --git a/qemud/qemud.c b/qemud/qemud.c index 4f04355..461c612 100644 --- a/qemud/qemud.c +++ b/qemud/qemud.c @@ -2529,6 +2529,7 @@ remoteReadConfigFile (struct qemud_server *server, const char *filename) char *unix_sock_ro_perms = NULL; char *unix_sock_rw_perms = NULL; char *unix_sock_group = NULL; + char *buf = NULL; #if HAVE_POLKIT /* Change the default back to no auth for non-root */ @@ -2574,13 +2575,34 @@ remoteReadConfigFile (struct qemud_server *server, const char *filename) if (getuid() != 0) { VIR_WARN0(_("Cannot set group when not running as root")); } else { - char buf[1024]; + int ret; struct group grpdata, *grp; - if (getgrnam_r(unix_sock_group, &grpdata, buf, sizeof(buf), &grp) != 0 || !grp) { + size_t maxbuf = sysconf(_SC_GETGR_R_SIZE_MAX); + + if (maxbuf == -1) + maxbuf = 1024; + + if (VIR_ALLOC_N(buf, maxbuf) < 0) { + VIR_ERROR("%s", _("Failed to allocate memory for buffer")); + goto free_and_fail; + } + + while ((ret = getgrnam_r(unix_sock_group, &grpdata, + buf, maxbuf, + &grp)) == ERANGE) { + maxbuf *= 2; + if (VIR_REALLOC_N(buf, maxbuf) < 0) { + VIR_ERROR("%s", _("Failed to reallocate memory for buffer")); + goto free_and_fail; + } + } + + if (ret != 0 || !grp) { VIR_ERROR(_("Failed to lookup group '%s'"), unix_sock_group); goto free_and_fail; } unix_sock_gid = grp->gr_gid; + VIR_FREE (buf); } free (unix_sock_group); unix_sock_group = NULL; @@ -2643,6 +2665,7 @@ remoteReadConfigFile (struct qemud_server *server, const char *filename) free (unix_sock_ro_perms); free (unix_sock_rw_perms); free (unix_sock_group); + VIR_FREE (buf); /* Don't bother trying to free listen_addr, tcp_port, tls_port, key_file, cert_file, ca_file, or crl_file, since they are initialized to -- 1.6.2.1
-- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list