diff --git a/lzw.c b/lzw.c
index 3bd991dc12f03295e5594afc174c6d8cc344179a..9d0159a85b19e48c430bcf652449eabd50e2be32 100644
--- a/lzw.c
+++ b/lzw.c
@@ -367,7 +367,7 @@ act_LZW_data(const HParseResult *p, void *u)
 
 	total_buffer_size = first.len + rest.len;
 
-	buffer = malloc(sizeof(uint8_t) * total_buffer_size); // XXX arena alloc, calloc
+	buffer = calloc(total_buffer_size, sizeof(uint8_t));
 	memcpy(buffer, first.token, first.len);
 	memcpy(buffer+first.len, rest.token, rest.len);
 	// XXX: Memory use would be greatly decreased if first.token and rest.token could be freed here (allocated in act_LZW_firstcode and act_LZW_body)