summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2008-07-28 23:36:57 +0200
committerLennart Poettering <lennart@poettering.net>2008-07-28 23:36:57 +0200
commit448efcf32710bb97f658cd9e4c50990be3c9f1e8 (patch)
tree7b963a8cd81046652b4c44a34909c8daa391ae94
parent734330e76f64d64da283fdfe72eea936b2081c4f (diff)
add a bit more error checking
-rw-r--r--libdaemon/dexec.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/libdaemon/dexec.c b/libdaemon/dexec.c
index 4cf162b..3df8f2f 100644
--- a/libdaemon/dexec.c
+++ b/libdaemon/dexec.c
@@ -74,10 +74,17 @@ int daemon_execv(const char *dir, int *ret, const char *prog, va_list ap) {
int i;
if (p[1] != 1)
- dup2(p[1], 1);
+ if (dup2(p[1], 1) < 0) {
+ daemon_log(LOG_ERR, "dup2: %s", strerror(errno));
+ goto fail;
+ }
if (p[1] != 2)
- dup2(p[1], 2);
+ if (dup2(p[1], 2) < 0) {
+ daemon_log(LOG_ERR, "dup2: %s", strerror(errno));
+ goto fail;
+ }
+
if (p[0] > 2)
close(p[0]);
@@ -86,9 +93,10 @@ int daemon_execv(const char *dir, int *ret, const char *prog, va_list ap) {
close(p[1]);
close(0);
+
if (open("/dev/null", O_RDONLY) != 0) {
daemon_log(LOG_ERR, "Unable to open /dev/null as STDIN");
- _exit(EXIT_FAILURE);
+ goto fail;
}
daemon_close_all(-1);
@@ -192,8 +200,10 @@ int daemon_execv(const char *dir, int *ret, const char *prog, va_list ap) {
daemon_log(LOG_ERR, "waitpid(): %s", strerror(errno));
return -1;
} else {
- if (!WIFEXITED(r))
+ if (!WIFEXITED(r)) {
+ errno = ECANCELED;
return -1;
+ }
if (ret)
*ret = WEXITSTATUS(r);