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:
Eric Blake 2011-01-28 14:22:39 -07:00
parent dc52cab126
commit e67ae61991
4 changed files with 52 additions and 43 deletions

View File

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

View File

@ -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 */

View File

@ -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();

View File

@ -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 *