commit - 44775e426b9da914878d11e9e31d6246460dfb4a
commit + 35699cf9db102f7ac133057073a650392bb1bbb2
blob - f39de9fc841ec3c1691a653834581411633c1c67
blob + 3be970ff30966a8c4cb6ec200f15209ef9f5a374
--- smtp_proc.c
+++ smtp_proc.c
smtp_newline(int fd, short event, void *arg)
{
struct event *stdinev = (struct event *)arg;
- char *line = NULL;
+ char *line = NULL, *linedup;
size_t linesize = 0;
ssize_t linelen;
char *start, *end, *type, *direction, *phase, *params;
int i;
while ((linelen = getline(&line, &linesize, stdin)) != -1) {
+ if ((linedup = strdup(line)) == NULL)
+ fatalx(NULL);
if (line[linelen - 1] != '\n')
- fatalx("Invalid line received: missing newline: %s", line);
+ fatalx("Invalid line received: missing newline: %s", linedup);
line[linelen - 1] = '\0';
type = line;
if ((start = strchr(type, '|')) == NULL)
- fatalx("Invalid line received: missing version: %s", line);
+ fatalx("Invalid line received: missing version: %s", linedup);
start++[0] = '\0';
if ((end = strchr(start, '|')) == NULL)
- fatalx("Invalid line received: missing time: %s", line);
+ fatalx("Invalid line received: missing time: %s", linedup);
end++[0] = '\0';
if (strcmp(start, "1") != 0)
- fatalx("Unsupported protocol received: %s: %s", start, line);
+ fatalx("Unsupported protocol received: %s: %s", start, linedup);
version = 1;
start = end;
if ((direction = strchr(start, '|')) == NULL)
- fatalx("Invalid line received: missing direction: %s", line);
+ fatalx("Invalid line received: missing direction: %s", linedup);
direction++[0] = '\0';
tm.tv_sec = (time_t) strtoull(start, &end, 10);
tm.tv_nsec = 0;
if (start[0] == '\0' || (end[0] != '\0' && end[0] != '.'))
- fatalx("Invalid line received: invalid timestamp: %s", line);
+ fatalx("Invalid line received: invalid timestamp: %s", linedup);
if (end[0] == '.') {
start = end + 1;
tm.tv_nsec = strtol(start, &end, 10);
if (start[0] == '\0' || end[0] != '\0')
fatalx("Invalid line received: invalid "
- "timestamp: %s", line);
+ "timestamp: %s", linedup);
for (i = 9 - (end - start); i > 0; i--)
tm.tv_nsec *= 10;
}
if ((phase = strchr(direction, '|')) == NULL)
- fatalx("Invalid line receieved: missing phase: %s", line);
+ fatalx("Invalid line receieved: missing phase: %s", linedup);
phase++[0] = '\0';
if ((start = strchr(phase, '|')) == NULL)
- fatalx("Invalid line received: missing reqid: %s", line);
+ fatalx("Invalid line received: missing reqid: %s", linedup);
start++[0] = '\0';
reqid = strtoull(start, ¶ms, 16);
if (start[0] == '|' || (params[0] != '|' & params[0] != '\0'))
- fatalx("Invalid line received: invalid reqid: %s", line);
+ fatalx("Invalid line received: invalid reqid: %s", linedup);
params++;
for (i = 0; i < NITEMS(smtp_callbacks); i++) {
}
if (i == NITEMS(smtp_callbacks)) {
fatalx("Invalid line received: received unregistered "
- "%s: %s: %s", type, phase, line);
+ "%s: %s: %s", type, phase, linedup);
}
if (strcmp(type, "filter") == 0) {
start = params;
token = strtoull(start, ¶ms, 16);
if (start[0] == '|' || params[0] != '|')
- fatalx("Invalid line received: invalid token: %s", line);
+ fatalx("Invalid line received: invalid token: %s", linedup);
params++;
smtp_callbacks[i].smtp_filter(&(smtp_callbacks[i]),
version, &tm, reqid, token, params);
} else
smtp_callbacks[i].smtp_report(&(smtp_callbacks[i]),
version, &tm, reqid, params);
+ free(linedup);
}
if (feof(stdin) || (ferror(stdin) && errno != EAGAIN))
event_del(stdinev);