diff --git a/lib/hush.c b/lib/hush.c
index 23926d6d50b64151f87d9be939d36c0d2fb9b764..629578755000d58511467b54b8e32c1e8716912c 100644
--- a/lib/hush.c
+++ b/lib/hush.c
@@ -1,9 +1,11 @@
+// -*- c-basic-offset: 8; tab-width: 8 -*-
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/wait.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <string.h>
 
 int main (int argc, char** argv) {
 	// Argv[1] is the message
@@ -11,7 +13,12 @@ int main (int argc, char** argv) {
 	// the rest are passed to the child
 	if (argc < 3) return 1;
 	printf ("\x1b[1;32m*\x1b[0m %s...", argv[1]);
-	char cbuf[4096];
+
+	char *cbuf = malloc(4096);
+	size_t cbuf_cap = 4096;
+	size_t cbuf_len = 0;
+	char cbuf2[4096];
+
 	argc-=2;
 	argv+=1;
 	for (int i = 0; i < argc; i++)
@@ -40,24 +47,27 @@ int main (int argc, char** argv) {
 		if (cols1) { cols = atoi(cols1); } else { cols = 80; }
 		close(fd[0]);
 		int delta = 1;
-		int ct = 0;
 		while (delta != 0) {
-			delta = read (fd[1], cbuf+ct, 4096-ct);
-			ct+= delta;
+			delta = read (fd[1], cbuf2, 4096);
+			while ((cbuf_len + delta) >= cbuf_cap)
+				cbuf = realloc(cbuf, cbuf_cap *= 2);
+			memcpy(cbuf + cbuf_len, cbuf2, delta);
+			cbuf_len += delta;
 		}
-		cbuf[ct] = 0;
+		
 		int status;
 		wait(&status);
 		fflush (NULL);
 		if (status) {
 			fprintf (stderr, "\x1b[%dG\x1b[1;34m[\x1b[1;31m!!\x1b[1;34m]\x1b[0m\n", cols-4);
-		} else if (ct) {
+		} else if (cbuf_len) {
 			fprintf (stderr, "\x1b[%dG\x1b[1;34m[\x1b[0;33mWW\x1b[1;34m]\x1b[0m\n", cols-4);
 		} else {
 			fprintf (stderr, "\x1b[%dG\x1b[1;34m[\x1b[1;32mOK\x1b[1;34m]\x1b[0m\n", cols-4);
 		}
 		fflush (NULL);
-		printf ("%s", cbuf);
+		write(2, cbuf, cbuf_len);
+		free(cbuf);
 		fflush (NULL);
 		return WEXITSTATUS(status);
 	}