commit - 3abc7c4b3eaa45819f3042bd01cd139ae8beb72b
commit + ced7acc6aba99917f09e1fe3b8d830fba523be2b
blob - be114e97cf4fe0fa9ece5653d2d980aecd3fa2b9
blob + 27184b20e50af303d044271140c7e5b737f04d3a
--- smtp_proc.c
+++ smtp_proc.c
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;
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);
} else
smtp_callbacks[i].smtp_report(&(smtp_callbacks[i]),
version, &tm, reqid, params);
- free(linedup);
}
if (linelen == 0 || errno != EAGAIN)
event_del(stdinev);