summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormiau <miaukatzemiau@priveasy.de>2011-12-02 09:08:58 (GMT)
committermiau <miaukatzemiau@priveasy.de>2011-12-02 09:08:58 (GMT)
commit486eaae0459603f8dbdfecdc286e0f3f3393048e (patch)
tree14063fa58a8102d89f7a47656fbf1a32598c7b9a
parentdb56c18a6188dd77f40eda1eba782770f7ef733e (diff)
fix two off-by-one errors during io redirection
-rw-r--r--src/listener.c12
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");
contact: Jan Huwald // Impressum