commit 35699cf9db102f7ac133057073a650392bb1bbb2 from: Martijn van Duren date: Fri Mar 29 13:05:32 2019 UTC Logging an unmodified line works better commit - 44775e426b9da914878d11e9e31d6246460dfb4a commit + 35699cf9db102f7ac133057073a650392bb1bbb2 blob - f39de9fc841ec3c1691a653834581411633c1c67 blob + 3be970ff30966a8c4cb6ec200f15209ef9f5a374 --- smtp_proc.c +++ smtp_proc.c @@ -110,7 +110,7 @@ static void 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; @@ -120,45 +120,47 @@ smtp_newline(int fd, short event, void *arg) 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++) { @@ -169,19 +171,20 @@ smtp_newline(int fd, short event, void *arg) } 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);