virCommandAddEnvBuffer;
virCommandAddEnvFormat;
virCommandAddEnvPair;
-virCommandAddEnvPass;
+virCommandAddEnvPassAllowSUID;
+virCommandAddEnvPassBlockSUID;
virCommandAddEnvPassCommon;
virCommandAddEnvString;
virCommandAllowCap;
cmd = virCommandNew(vm->def->emulator);
/* The controller may call ip command, so we have to retain PATH. */
- virCommandAddEnvPass(cmd, "PATH");
+ virCommandAddEnvPassBlockSUID(cmd, "PATH", "/bin:/usr/bin");
virCommandAddEnvFormat(cmd, "LIBVIRT_DEBUG=%d",
virLogGetDefaultPriority());
* security issues and might not work when using VNC.
*/
if (cfg->vncAllowHostAudio)
- virCommandAddEnvPass(cmd, "QEMU_AUDIO_DRV");
+ virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
else
virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none");
* use QEMU's host audio drivers, possibly SDL too
* User can set these two before starting libvirtd
*/
- virCommandAddEnvPass(cmd, "QEMU_AUDIO_DRV");
- virCommandAddEnvPass(cmd, "SDL_AUDIODRIVER");
+ virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
+ virCommandAddEnvPassBlockSUID(cmd, "SDL_AUDIODRIVER", NULL);
/* New QEMU has this flag to let us explicitly ask for
* SDL graphics. This is better than relying on the
virCommandAddArg(cmd, "-nographic");
if (cfg->nogfxAllowHostAudio)
- virCommandAddEnvPass(cmd, "QEMU_AUDIO_DRV");
+ virCommandAddEnvPassBlockSUID(cmd, "QEMU_AUDIO_DRV", NULL);
else
virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none");
}
NULL);
virCommandAddEnvPassCommon(cmd);
- virCommandAddEnvPass(cmd, "XDG_CACHE_HOME");
- virCommandAddEnvPass(cmd, "XDG_CONFIG_HOME");
- virCommandAddEnvPass(cmd, "XDG_RUNTIME_DIR");
+ virCommandAddEnvPassBlockSUID(cmd, "XDG_CACHE_HOME", NULL);
+ virCommandAddEnvPassBlockSUID(cmd, "XDG_CONFIG_HOME", NULL);
+ virCommandAddEnvPassBlockSUID(cmd, "XDG_RUNTIME_DIR", NULL);
virCommandClearCaps(cmd);
virCommandDaemonize(cmd);
ret = virCommandRun(cmd, NULL);
cmd = virCommandNew(binary ? binary : "ssh");
virCommandAddEnvPassCommon(cmd);
- virCommandAddEnvPass(cmd, "KRB5CCNAME");
- virCommandAddEnvPass(cmd, "SSH_AUTH_SOCK");
- virCommandAddEnvPass(cmd, "SSH_ASKPASS");
- virCommandAddEnvPass(cmd, "DISPLAY");
- virCommandAddEnvPass(cmd, "XAUTHORITY");
+ virCommandAddEnvPassBlockSUID(cmd, "KRB5CCNAME", NULL);
+ virCommandAddEnvPassBlockSUID(cmd, "SSH_AUTH_SOCK", NULL);
+ virCommandAddEnvPassBlockSUID(cmd, "SSH_ASKPASS", NULL);
+ virCommandAddEnvPassBlockSUID(cmd, "DISPLAY", NULL);
+ virCommandAddEnvPassBlockSUID(cmd, "XAUTHORITY", NULL);
virCommandClearCaps(cmd);
if (service)
/**
- * virCommandAddEnvPass:
+ * virCommandAddEnvPassAllowSUID:
* @cmd: the command to modify
* @name: the name to look up in current environment
*
* Pass an environment variable to the child
* using current process' value
+ *
+ * Allow to be passed even if setuid
+ */
+void
+virCommandAddEnvPassAllowSUID(virCommandPtr cmd, const char *name)
+{
+ const char *value;
+ if (!cmd || cmd->has_error)
+ return;
+
+ value = virGetEnvAllowSUID(name);
+ if (value)
+ virCommandAddEnvPair(cmd, name, value);
+}
+
+
+/**
+ * virCommandAddEnvPassBlockSUID:
+ * @cmd: the command to modify
+ * @name: the name to look up in current environment
+ * @defvalue: value to return if running setuid, may be NULL
+ *
+ * Pass an environment variable to the child
+ * using current process' value.
+ *
+ * Do not pass if running setuid
*/
void
-virCommandAddEnvPass(virCommandPtr cmd, const char *name)
+virCommandAddEnvPassBlockSUID(virCommandPtr cmd, const char *name, const char *defvalue)
{
- char *value;
+ const char *value;
if (!cmd || cmd->has_error)
return;
- value = getenv(name);
+ value = virGetEnvBlockSUID(name);
+ if (!value)
+ value = defvalue;
if (value)
virCommandAddEnvPair(cmd, name, value);
}
virCommandAddEnvPair(cmd, "LC_ALL", "C");
- virCommandAddEnvPass(cmd, "LD_PRELOAD");
- virCommandAddEnvPass(cmd, "LD_LIBRARY_PATH");
- virCommandAddEnvPass(cmd, "PATH");
- virCommandAddEnvPass(cmd, "HOME");
- virCommandAddEnvPass(cmd, "USER");
- virCommandAddEnvPass(cmd, "LOGNAME");
- virCommandAddEnvPass(cmd, "TMPDIR");
+ virCommandAddEnvPassBlockSUID(cmd, "LD_PRELOAD", NULL);
+ virCommandAddEnvPassBlockSUID(cmd, "LD_LIBRARY_PATH", NULL);
+ virCommandAddEnvPassBlockSUID(cmd, "PATH", "/bin:/usr/bin");
+ virCommandAddEnvPassBlockSUID(cmd, "HOME", NULL);
+ virCommandAddEnvPassAllowSUID(cmd, "USER");
+ virCommandAddEnvPassAllowSUID(cmd, "LOGNAME");
+ virCommandAddEnvPassBlockSUID(cmd, "TMPDIR", NULL);
}
/**
void virCommandAddEnvBuffer(virCommandPtr cmd,
virBufferPtr buf);
-void virCommandAddEnvPass(virCommandPtr cmd,
- const char *name) ATTRIBUTE_NONNULL(2);
+void virCommandAddEnvPassBlockSUID(virCommandPtr cmd,
+ const char *name,
+ const char *defvalue) ATTRIBUTE_NONNULL(2);
+
+void virCommandAddEnvPassAllowSUID(virCommandPtr cmd,
+ const char *name) ATTRIBUTE_NONNULL(2);
void virCommandAddEnvPassCommon(virCommandPtr cmd);
{
virCommandPtr cmd = virCommandNew(abs_builddir "/commandhelper");
- virCommandAddEnvPass(cmd, "DISPLAY");
- virCommandAddEnvPass(cmd, "DOESNOTEXIST");
+ virCommandAddEnvPassBlockSUID(cmd, "DISPLAY", NULL);
+ virCommandAddEnvPassBlockSUID(cmd, "DOESNOTEXIST", NULL);
if (virCommandRun(cmd, NULL) < 0) {
virErrorPtr err = virGetLastError();
virCommandPtr cmd = virCommandNew(abs_builddir "/commandhelper");
virCommandAddEnvPassCommon(cmd);
- virCommandAddEnvPass(cmd, "DISPLAY");
- virCommandAddEnvPass(cmd, "DOESNOTEXIST");
+ virCommandAddEnvPassBlockSUID(cmd, "DISPLAY", NULL);
+ virCommandAddEnvPassBlockSUID(cmd, "DOESNOTEXIST", NULL);
if (virCommandRun(cmd, NULL) < 0) {
virErrorPtr err = virGetLastError();