X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Ftransports%2Fautoreply.c;h=1aef02aafd77e661455ed206c0f12d85ebca16a3;hb=9f01e50d7efc5c625614e4e055790ca4a92a52a8;hp=9decfbaeab6d9378b9b920c5c40dc7639d47d176;hpb=d7978c0f8af20ff4c3f770589b1bb81568aecff3;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/transports/autoreply.c b/src/src/transports/autoreply.c index 9decfbaea..1aef02aaf 100644 --- a/src/src/transports/autoreply.c +++ b/src/src/transports/autoreply.c @@ -446,7 +446,7 @@ if (oncelog && *oncelog != 0 && to) cache_size = statbuf.st_size; add_size = sizeof(time_t) + Ustrlen(to) + 1; - cache_buff = store_get(cache_size + add_size); + cache_buff = store_get(cache_size + add_size, is_tainted(oncelog)); if (read(cache_fd, cache_buff, cache_size) != cache_size) { @@ -598,52 +598,7 @@ if (h) fprintf(fp, "In-Reply-To: %s", message_id); } -/* Generate a References header if there is at least one of Message-ID:, -References:, or In-Reply-To: (see RFC 2822). */ - -for (h = header_list; h; h = h->next) - if (h->type != htype_old && strncmpic(US"References:", h->text, 11) == 0) - break; - -if (!h) - for (h = header_list; h; h = h->next) - if (h->type != htype_old && strncmpic(US"In-Reply-To:", h->text, 12) == 0) - break; - -/* We limit the total length of references. Although there is no fixed -limit, some systems do not like headers growing beyond recognition. -Keep the first message ID for the thread root and the last few for -the position inside the thread, up to a maximum of 12 altogether. */ - -if (h || message_id) - { - fprintf(fp, "References:"); - if (h) - { - uschar *s, *id, *error; - uschar *referenced_ids[12]; - int reference_count = 0; - - s = Ustrchr(h->text, ':') + 1; - f.parse_allow_group = FALSE; - while (*s != 0 && (s = parse_message_id(s, &id, &error)) != NULL) - { - if (reference_count == nelem(referenced_ids)) - { - memmove(referenced_ids + 1, referenced_ids + 2, - sizeof(referenced_ids) - 2*sizeof(uschar *)); - referenced_ids[reference_count - 1] = id; - } - else referenced_ids[reference_count++] = id; - } - for (int i = 0; i < reference_count; ++i) fprintf(fp, " %s", referenced_ids[i]); - } - - /* The message id will have a newline on the end of it. */ - - if (message_id) fprintf(fp, " %s", message_id); - else fprintf(fp, "\n"); - } +moan_write_references(fp, message_id); /* Add an Auto-Submitted: header */ @@ -821,48 +776,26 @@ if (logfile) int log_fd = Uopen(logfile, O_WRONLY|O_APPEND|O_CREAT, ob->mode); if (log_fd >= 0) { - uschar *ptr = log_buffer; + gstring gs = { .size = LOG_BUFFER_SIZE, .ptr = 0, .s = log_buffer }, *g = &gs; + + /* Use taint-unchecked routines for writing into log_buffer, trusting + that we'll never expand it. */ + DEBUG(D_transport) debug_printf("logging message details\n"); - sprintf(CS ptr, "%s\n", tod_stamp(tod_log)); - while(*ptr) ptr++; + g = string_fmt_append_f(g, SVFMT_TAINT_NOCHK, "%s\n", tod_stamp(tod_log)); if (from) - { - (void)string_format(ptr, LOG_BUFFER_SIZE - (ptr-log_buffer), - " From: %s\n", from); - while(*ptr) ptr++; - } + g = string_fmt_append_f(g, SVFMT_TAINT_NOCHK, " From: %s\n", from); if (to) - { - (void)string_format(ptr, LOG_BUFFER_SIZE - (ptr-log_buffer), - " To: %s\n", to); - while(*ptr) ptr++; - } + g = string_fmt_append_f(g, SVFMT_TAINT_NOCHK, " To: %s\n", to); if (cc) - { - (void)string_format(ptr, LOG_BUFFER_SIZE - (ptr-log_buffer), - " Cc: %s\n", cc); - while(*ptr) ptr++; - } + g = string_fmt_append_f(g, SVFMT_TAINT_NOCHK, " Cc: %s\n", cc); if (bcc) - { - (void)string_format(ptr, LOG_BUFFER_SIZE - (ptr-log_buffer), - " Bcc: %s\n", bcc); - while(*ptr) ptr++; - } + g = string_fmt_append_f(g, SVFMT_TAINT_NOCHK, " Bcc: %s\n", bcc); if (subject) - { - (void)string_format(ptr, LOG_BUFFER_SIZE - (ptr-log_buffer), - " Subject: %s\n", subject); - while(*ptr) ptr++; - } + g = string_fmt_append_f(g, SVFMT_TAINT_NOCHK, " Subject: %s\n", subject); if (headers) - { - (void)string_format(ptr, LOG_BUFFER_SIZE - (ptr-log_buffer), - " %s\n", headers); - while(*ptr) ptr++; - } - if(write(log_fd, log_buffer, ptr - log_buffer) != ptr-log_buffer - || close(log_fd)) + g = string_fmt_append_f(g, SVFMT_TAINT_NOCHK, " %s\n", headers); + if(write(log_fd, g->s, g->ptr) != g->ptr || close(log_fd)) DEBUG(D_transport) debug_printf("Problem writing log file %s for %s " "transport\n", logfile, tblock->name); }