mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
build: avoid close, system
* src/fdstream.c (virFDStreamOpenFile, virFDStreamCreateFile): Use VIR_FORCE_CLOSE instead of close. * tests/commandtest.c (mymain): Likewise. * tools/virsh.c (editFile): Use virCommand instead of system. * src/util/util.c (__virExec): Special case preservation of std file descriptors to child.
This commit is contained in:
parent
dc52cab126
commit
e67ae61991
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* fdstream.h: generic streams impl for file descriptors
|
* fdstream.h: generic streams impl for file descriptors
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009-2010 Red Hat, Inc.
|
* Copyright (C) 2009-2011 Red Hat, Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
@ -452,7 +452,7 @@ int virFDStreamOpenFile(virStreamPtr st,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
close(fd);
|
VIR_FORCE_CLOSE(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -498,6 +498,6 @@ int virFDStreamCreateFile(virStreamPtr st,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
close(fd);
|
VIR_FORCE_CLOSE(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -593,14 +593,16 @@ __virExec(const char *const*argv,
|
|||||||
goto fork_error;
|
goto fork_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
VIR_FORCE_CLOSE(infd);
|
if (infd != STDIN_FILENO)
|
||||||
|
VIR_FORCE_CLOSE(infd);
|
||||||
VIR_FORCE_CLOSE(null);
|
VIR_FORCE_CLOSE(null);
|
||||||
tmpfd = childout; /* preserve childout value */
|
if (childout > STDERR_FILENO) {
|
||||||
VIR_FORCE_CLOSE(tmpfd);
|
tmpfd = childout; /* preserve childout value */
|
||||||
if (childerr > 0 &&
|
VIR_FORCE_CLOSE(tmpfd);
|
||||||
|
}
|
||||||
|
if (childerr > STDERR_FILENO &&
|
||||||
childerr != childout) {
|
childerr != childout) {
|
||||||
VIR_FORCE_CLOSE(childerr);
|
VIR_FORCE_CLOSE(childerr);
|
||||||
childout = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize full logging for a while */
|
/* Initialize full logging for a while */
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* commandtest.c: Test the libCommand API
|
* commandtest.c: Test the libCommand API
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010 Red Hat, Inc.
|
* Copyright (C) 2010-2011 Red Hat, Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
@ -714,6 +714,7 @@ mymain(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
char cwd[PATH_MAX];
|
char cwd[PATH_MAX];
|
||||||
|
int fd;
|
||||||
|
|
||||||
abs_srcdir = getenv("abs_srcdir");
|
abs_srcdir = getenv("abs_srcdir");
|
||||||
if (!abs_srcdir)
|
if (!abs_srcdir)
|
||||||
@ -731,9 +732,12 @@ mymain(int argc, char **argv)
|
|||||||
|
|
||||||
/* Kill off any inherited fds that might interfere with our
|
/* Kill off any inherited fds that might interfere with our
|
||||||
* testing. */
|
* testing. */
|
||||||
close(3);
|
fd = 3;
|
||||||
close(4);
|
VIR_FORCE_CLOSE(fd);
|
||||||
close(5);
|
fd = 4;
|
||||||
|
VIR_FORCE_CLOSE(fd);
|
||||||
|
fd = 5;
|
||||||
|
VIR_FORCE_CLOSE(fd);
|
||||||
|
|
||||||
virInitialize();
|
virInitialize();
|
||||||
|
|
||||||
|
@ -56,6 +56,7 @@
|
|||||||
#include "../daemon/event.h"
|
#include "../daemon/event.h"
|
||||||
#include "configmake.h"
|
#include "configmake.h"
|
||||||
#include "threads.h"
|
#include "threads.h"
|
||||||
|
#include "command.h"
|
||||||
|
|
||||||
static char *progname;
|
static char *progname;
|
||||||
|
|
||||||
@ -9354,50 +9355,52 @@ static int
|
|||||||
editFile (vshControl *ctl, const char *filename)
|
editFile (vshControl *ctl, const char *filename)
|
||||||
{
|
{
|
||||||
const char *editor;
|
const char *editor;
|
||||||
char *command;
|
virCommandPtr cmd;
|
||||||
int command_ret;
|
int ret = -1;
|
||||||
|
int outfd = STDOUT_FILENO;
|
||||||
|
int errfd = STDERR_FILENO;
|
||||||
|
|
||||||
editor = getenv ("VISUAL");
|
editor = getenv ("VISUAL");
|
||||||
if (!editor) editor = getenv ("EDITOR");
|
if (!editor)
|
||||||
if (!editor) editor = "vi"; /* could be cruel & default to ed(1) here */
|
editor = getenv ("EDITOR");
|
||||||
|
if (!editor)
|
||||||
|
editor = "vi"; /* could be cruel & default to ed(1) here */
|
||||||
|
|
||||||
/* Check that filename doesn't contain shell meta-characters, and
|
/* Check that filename doesn't contain shell meta-characters, and
|
||||||
* if it does, refuse to run. Follow the Unix conventions for
|
* if it does, refuse to run. Follow the Unix conventions for
|
||||||
* EDITOR: the user can intentionally specify command options, so
|
* EDITOR: the user can intentionally specify command options, so
|
||||||
* we don't protect any shell metacharacters there. Lots more
|
* we don't protect any shell metacharacters there. Lots more
|
||||||
* than virsh will misbehave if EDITOR has bogus contents (which
|
* than virsh will misbehave if EDITOR has bogus contents (which
|
||||||
* is why sudo scrubs it by default).
|
* is why sudo scrubs it by default). Conversely, if the editor
|
||||||
|
* is safe, we can run it directly rather than wasting a shell.
|
||||||
*/
|
*/
|
||||||
if (strspn (filename, ACCEPTED_CHARS) != strlen (filename)) {
|
if (strspn (editor, ACCEPTED_CHARS) != strlen (editor)) {
|
||||||
vshError(ctl,
|
if (strspn (filename, ACCEPTED_CHARS) != strlen (filename)) {
|
||||||
_("%s: temporary filename contains shell meta or other "
|
vshError(ctl,
|
||||||
"unacceptable characters (is $TMPDIR wrong?)"),
|
_("%s: temporary filename contains shell meta or other "
|
||||||
filename);
|
"unacceptable characters (is $TMPDIR wrong?)"),
|
||||||
return -1;
|
filename);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
cmd = virCommandNewArgList("sh", "-c", NULL);
|
||||||
|
virCommandAddArgFormat(cmd, "%s %s", editor, filename);
|
||||||
|
} else {
|
||||||
|
cmd = virCommandNewArgList(editor, filename, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virAsprintf(&command, "%s %s", editor, filename) == -1) {
|
virCommandSetInputFD(cmd, STDIN_FILENO);
|
||||||
vshError(ctl,
|
virCommandSetOutputFD(cmd, &outfd);
|
||||||
_("virAsprintf: could not create editing command: %s"),
|
virCommandSetErrorFD(cmd, &errfd);
|
||||||
strerror(errno));
|
if (virCommandRunAsync(cmd, NULL) < 0 ||
|
||||||
return -1;
|
virCommandWait(cmd, NULL) < 0) {
|
||||||
|
virshReportError(ctl);
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
command_ret = system (command);
|
cleanup:
|
||||||
if (command_ret == -1) {
|
virCommandFree(cmd);
|
||||||
vshError(ctl,
|
return ret;
|
||||||
_("%s: edit command failed: %s"), command, strerror(errno));
|
|
||||||
VIR_FREE(command);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (WEXITSTATUS(command_ret) != 0) {
|
|
||||||
vshError(ctl,
|
|
||||||
_("%s: command exited with non-zero status"), command);
|
|
||||||
VIR_FREE(command);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
VIR_FREE(command);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
|
Loading…
x
Reference in New Issue
Block a user