Add upstream patches: don't duplicate environment variables (RHBZ#859596).

This commit is contained in:
Richard W.M. Jones 2012-09-24 20:58:47 +01:00
parent cd3767e3b9
commit 404e58cb18
3 changed files with 149 additions and 2 deletions

View File

@ -0,0 +1,94 @@
From f644361b1eeb78fd59be4cd7ec85567bbf300506 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 24 Sep 2012 17:30:18 +0100
Subject: [PATCH 1/2] command: Move environ-adding code to common function
virCommandAddEnv.
This is just code motion. The semantics of the code should be
identical after this change.
---
src/util/command.c | 40 ++++++++++++++++++++--------------------
1 file changed, 20 insertions(+), 20 deletions(-)
diff --git a/src/util/command.c b/src/util/command.c
index 5d6e17b..f7d92dd 100644
--- a/src/util/command.c
+++ b/src/util/command.c
@@ -984,6 +984,22 @@ virCommandNonblockingFDs(virCommandPtr cmd)
cmd->flags |= VIR_EXEC_NONBLOCK;
}
+/* Add an environment variable to the cmd->env list. 'env' is a
+ * string like "name=value".
+ */
+static inline void
+virCommandAddEnv(virCommandPtr cmd, char *env)
+{
+ /* Arg plus trailing NULL. */
+ if (VIR_RESIZE_N(cmd->env, cmd->maxenv, cmd->nenv, 1 + 1) < 0) {
+ VIR_FREE(env);
+ cmd->has_error = ENOMEM;
+ return;
+ }
+
+ cmd->env[cmd->nenv++] = env;
+}
+
/**
* virCommandAddEnvFormat:
* @cmd: the command to modify
@@ -1009,14 +1025,7 @@ virCommandAddEnvFormat(virCommandPtr cmd, const char *format, ...)
}
va_end(list);
- /* Arg plus trailing NULL. */
- if (VIR_RESIZE_N(cmd->env, cmd->maxenv, cmd->nenv, 1 + 1) < 0) {
- VIR_FREE(env);
- cmd->has_error = ENOMEM;
- return;
- }
-
- cmd->env[cmd->nenv++] = env;
+ virCommandAddEnv(cmd, env);
}
/**
@@ -1056,14 +1065,7 @@ virCommandAddEnvString(virCommandPtr cmd, const char *str)
return;
}
- /* env plus trailing NULL */
- if (VIR_RESIZE_N(cmd->env, cmd->maxenv, cmd->nenv, 1 + 1) < 0) {
- VIR_FREE(env);
- cmd->has_error = ENOMEM;
- return;
- }
-
- cmd->env[cmd->nenv++] = env;
+ virCommandAddEnv(cmd, env);
}
@@ -1084,9 +1086,7 @@ virCommandAddEnvBuffer(virCommandPtr cmd, virBufferPtr buf)
return;
}
- /* env plus trailing NULL. */
- if (virBufferError(buf) ||
- VIR_RESIZE_N(cmd->env, cmd->maxenv, cmd->nenv, 1 + 1) < 0) {
+ if (virBufferError(buf)) {
cmd->has_error = ENOMEM;
virBufferFreeAndReset(buf);
return;
@@ -1096,7 +1096,7 @@ virCommandAddEnvBuffer(virCommandPtr cmd, virBufferPtr buf)
return;
}
- cmd->env[cmd->nenv++] = virBufferContentAndReset(buf);
+ virCommandAddEnv(cmd, virBufferContentAndReset(buf));
}
--
1.7.10.4

View File

@ -0,0 +1,45 @@
From 2b32735af480055e27400068d27364d521071117 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 24 Sep 2012 17:35:47 +0100
Subject: [PATCH 2/2] command: Change virCommandAddEnv so it replaces existing
environment variables.
---
src/util/command.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/src/util/command.c b/src/util/command.c
index f7d92dd..1adf7b9 100644
--- a/src/util/command.c
+++ b/src/util/command.c
@@ -985,11 +985,26 @@ virCommandNonblockingFDs(virCommandPtr cmd)
}
/* Add an environment variable to the cmd->env list. 'env' is a
- * string like "name=value".
+ * string like "name=value". If the named environment variable is
+ * already set, then it is replaced in the list.
*/
static inline void
virCommandAddEnv(virCommandPtr cmd, char *env)
{
+ size_t namelen;
+ size_t i;
+
+ /* Search for the name in the existing environment. */
+ namelen = strcspn(env, "=");
+ for (i = 0; i < cmd->nenv; ++i) {
+ /* + 1 because we want to match the '=' character too. */
+ if (STREQLEN(cmd->env[i], env, namelen + 1)) {
+ VIR_FREE(cmd->env[i]);
+ cmd->env[i] = env;
+ return;
+ }
+ }
+
/* Arg plus trailing NULL. */
if (VIR_RESIZE_N(cmd->env, cmd->maxenv, cmd->nenv, 1 + 1) < 0) {
VIR_FREE(env);
--
1.7.10.4

View File

@ -316,7 +316,7 @@
Summary: Library providing a simple virtualization API
Name: libvirt
Version: 0.10.2
Release: 2%{?dist}%{?extra_release}
Release: 3%{?dist}%{?extra_release}
License: LGPLv2+
Group: Development/Libraries
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
@ -331,6 +331,11 @@ Source: http://libvirt.org/sources/%{?mainturl}libvirt-%{version}.tar.gz
# NB: This patch is Fedora-specific and not upstream.
Patch1: 0001-Use-qemu-system-i386-as-binary-instead-of-qemu.patch
# Don't duplicate environment variables
# (RHBZ#859596, upstream after 0.10.2).
Patch2: 0001-command-Move-environ-adding-code-to-common-function-.patch
Patch3: 0002-command-Change-virCommandAddEnv-so-it-replaces-exist.patch
%if %{with_libvirtd}
Requires: libvirt-daemon = %{version}-%{release}
%if %{with_network}
@ -1041,6 +1046,8 @@ of recent versions of Linux (and other OSes).
%prep
%setup -q
%patch1 -p1
%patch2 -p1
%patch3 -p1
%build
%if ! %{with_xen}
@ -1884,9 +1891,10 @@ rm -f $RPM_BUILD_ROOT%{_sysconfdir}/sysctl.d/libvirtd
%endif
%changelog
* Mon Sep 24 2012 Daniel Veillard <veillard@redhat.com> - 0.10.2-2
* Mon Sep 24 2012 Richard W.M. Jones <rjones@redhat.com> - 0.10.2-3
- Re-add 0001-Use-qemu-system-i386-as-binary-instead-of-qemu.patch
NB: This patch is Fedora-specific and not upstream.
- Add upstream patches: don't duplicate environment variables (RHBZ#859596).
* Mon Sep 24 2012 Daniel Veillard <veillard@redhat.com> - 0.10.2-1
- Upstream release 0.10.2