diff options
author | miau <miaukatzemiau@priveasy.de> | 2011-12-02 09:08:58 (GMT) |
---|---|---|
committer | miau <miaukatzemiau@priveasy.de> | 2011-12-02 09:08:58 (GMT) |
commit | 486eaae0459603f8dbdfecdc286e0f3f3393048e (patch) | |
tree | 14063fa58a8102d89f7a47656fbf1a32598c7b9a | |
parent | db56c18a6188dd77f40eda1eba782770f7ef733e (diff) |
fix two off-by-one errors during io redirection
-rw-r--r-- | src/listener.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/listener.c b/src/listener.c index eb2950e..9bb1063 100644 --- a/src/listener.c +++ b/src/listener.c @@ -65,12 +65,12 @@ int main(int argc, char **argv, char **envp) { } int fd_payload[2]; - pipe(fd_payload); + ENP(pipe(fd_payload), "pipe"); switch (fork()) { case 0: /* redirect payload to stdio, leave stdout/err, close the rest */ - ENP(dup(fd_payload[0], 1), "dup"); + ENP(dup2(fd_payload[0], 0), "dup"); ENP(close(fd_payload[0]), "close"); ENP(close(fd_payload[1]), "close"); ENP(close(fd), "close"); @@ -82,17 +82,19 @@ int main(int argc, char **argv, char **envp) { case -1: perror("fork"); exit(1); - default: - ENP(wait(), "wait"); } /* write payload to child process; the return value of write is intentionally ignored */ int tasklen = strlen(task); - if (tasklen < numbytes) + fprintf(stderr, "extra payload %d %d\n", tasklen, numbytes); + if (tasklen < numbytes) { write(fd_payload[1], buf + tasklen + 1, numbytes - tasklen - 1); + write(1, buf + tasklen + 1, numbytes - tasklen - 1); + } ENP(close(fd_payload[1]), "close"); ENP(close(fd_payload[0]), "close"); + ENP(wait(), "wait"); } perror("recvfrom"); |