Commit Diff


commit - 3abc7c4b3eaa45819f3042bd01cd139ae8beb72b
commit + ced7acc6aba99917f09e1fe3b8d830fba523be2b
blob - be114e97cf4fe0fa9ece5653d2d980aecd3fa2b9
blob + 27184b20e50af303d044271140c7e5b737f04d3a
--- smtp_proc.c
+++ smtp_proc.c
@@ -157,8 +157,9 @@ static void
 smtp_newline(int fd, short event, void *arg)
 {
 	struct event *stdinev = (struct event *)arg;
-	char *line = NULL, *linedup;
+	char *line = NULL, *linedup = NULL;
 	size_t linesize = 0;
+	size_t dupsize = 0;
 	ssize_t linelen;
 	char *start, *end, *type, *direction, *phase, *params;
 	int version;
@@ -167,8 +168,12 @@ smtp_newline(int fd, short event, void *arg)
 	int i;
 
 	while ((linelen = smtp_getline(&line, &linesize)) > 0) {
-		if ((linedup = strdup(line)) == NULL)
-			fatalx(NULL);
+		if (dupsize < linesize) {
+			if ((linedup = realloc(linedup, linesize)) == NULL)
+				fatal(NULL);
+			dupsize = linesize;
+		}
+		strlcpy(linedup, line, dupsize);
 		type = line;
 		if ((start = strchr(type, '|')) == NULL)
 			fatalx("Invalid line received: missing version: %s", linedup);
@@ -228,7 +233,6 @@ smtp_newline(int fd, short event, void *arg)
 		} else
 			smtp_callbacks[i].smtp_report(&(smtp_callbacks[i]),
 			    version, &tm, reqid, params);
-		free(linedup);
 	}
 	if (linelen == 0 || errno != EAGAIN)
 		event_del(stdinev);