X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Ftransports%2Fautoreply.c;h=1aef02aafd77e661455ed206c0f12d85ebca16a3;hb=9f01e50d7efc5c625614e4e055790ca4a92a52a8;hp=c3ed16962e87d595aa67943030212bbd90bf675e;hpb=6372d4c990f39ba6ad84a91af0a3a61a63bd50a3;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/transports/autoreply.c b/src/src/transports/autoreply.c index c3ed16962..1aef02aaf 100644 --- a/src/src/transports/autoreply.c +++ b/src/src/transports/autoreply.c @@ -154,7 +154,6 @@ Returns: expanded string if expansion succeeds; static uschar * checkexpand(uschar *s, address_item *addr, uschar *name, int type) { -uschar *t; uschar *ss = expand_string(s); if (ss == NULL) @@ -165,7 +164,7 @@ if (ss == NULL) return NULL; } -if (type != cke_text) for (t = ss; *t != 0; t++) +if (type != cke_text) for (uschar * t = ss; *t != 0; t++) { int c = *t; const uschar * sp; @@ -290,7 +289,7 @@ uschar *message_id = NULL; header_line *h; time_t now = time(NULL); time_t once_repeat_sec = 0; -FILE *f; +FILE *fp; FILE *ff = NULL; autoreply_transport_options_block *ob = @@ -403,7 +402,7 @@ if (ob->never_mail) /* If the -N option is set, can't do any more. */ -if (dont_deliver) +if (f.dont_deliver) { DEBUG(D_transport) debug_printf("*** delivery by %s transport bypassed by -N option\n", @@ -427,7 +426,7 @@ if (oncelog && *oncelog != 0 && to) if (ob->once_file_size > 0) { - uschar * p, * nextp; + uschar * nextp; struct stat statbuf; cache_fd = Uopen(oncelog, O_CREAT|O_RDWR, ob->mode); @@ -447,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) { @@ -464,7 +463,7 @@ if (oncelog && *oncelog != 0 && to) zero. If we find a match, put the time into "then", and the place where it was found into "cache_time". Otherwise, "then" is left at zero. */ - for (p = cache_buff; p < cache_buff + cache_size; p = nextp) + for (uschar * p = cache_buff; p < cache_buff + cache_size; p = nextp) { uschar *s = p + sizeof(time_t); nextp = s + Ustrlen(s) + 1; @@ -577,14 +576,14 @@ if (pid < 0) as the -t option is used. The "headers" stuff *must* be last in case there are newlines in it which might, if placed earlier, screw up other headers. */ -f = fdopen(fd, "wb"); +fp = fdopen(fd, "wb"); -if (from) fprintf(f, "From: %s\n", from); -if (reply_to) fprintf(f, "Reply-To: %s\n", reply_to); -if (to) fprintf(f, "To: %s\n", to); -if (cc) fprintf(f, "Cc: %s\n", cc); -if (bcc) fprintf(f, "Bcc: %s\n", bcc); -if (subject) fprintf(f, "Subject: %s\n", subject); +if (from) fprintf(fp, "From: %s\n", from); +if (reply_to) fprintf(fp, "Reply-To: %s\n", reply_to); +if (to) fprintf(fp, "To: %s\n", to); +if (cc) fprintf(fp, "Cc: %s\n", cc); +if (bcc) fprintf(fp, "Bcc: %s\n", bcc); +if (subject) fprintf(fp, "Subject: %s\n", subject); /* Generate In-Reply-To from the message_id header; there should always be one, but code defensively. */ @@ -596,70 +595,24 @@ if (h) { message_id = Ustrchr(h->text, ':') + 1; while (isspace(*message_id)) message_id++; - fprintf(f, "In-Reply-To: %s", message_id); + 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(f, "References:"); - if (h) - { - uschar *s, *id, *error; - uschar *referenced_ids[12]; - int reference_count = 0; - int i; - - s = Ustrchr(h->text, ':') + 1; - 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 (i = 0; i < reference_count; ++i) fprintf(f, " %s", referenced_ids[i]); - } - - /* The message id will have a newline on the end of it. */ - - if (message_id) fprintf(f, " %s", message_id); - else fprintf(f, "\n"); - } +moan_write_references(fp, message_id); /* Add an Auto-Submitted: header */ -fprintf(f, "Auto-Submitted: auto-replied\n"); +fprintf(fp, "Auto-Submitted: auto-replied\n"); /* Add any specially requested headers */ -if (headers) fprintf(f, "%s\n", headers); -fprintf(f, "\n"); +if (headers) fprintf(fp, "%s\n", headers); +fprintf(fp, "\n"); if (text) { - fprintf(f, "%s", CS text); - if (text[Ustrlen(text)-1] != '\n') fprintf(f, "\n"); + fprintf(fp, "%s", CS text); + if (text[Ustrlen(text)-1] != '\n') fprintf(fp, "\n"); } if (ff) @@ -675,9 +628,9 @@ if (ff) debug_printf("error while expanding line from file:\n %s\n %s\n", big_buffer, expand_string_message); } - fprintf(f, "%s", s ? CS s : CS big_buffer); + fprintf(fp, "%s", s ? CS s : CS big_buffer); } - else fprintf(f, "%s", CS big_buffer); + else fprintf(fp, "%s", CS big_buffer); } (void) fclose(ff); } @@ -694,7 +647,7 @@ if (return_message) : US"------ This is a copy of the message, including all the headers.\n"; transport_ctx tctx = { - .u = {.fd = fileno(f)}, + .u = {.fd = fileno(fp)}, .tblock = tblock, .addr = addr, .check_string = NULL, @@ -714,23 +667,23 @@ if (return_message) DELIVER_IN_BUFFER_SIZE; if (fstat(deliver_datafile, &statbuf) == 0 && statbuf.st_size > max) { - fprintf(f, "\n%s" + fprintf(fp, "\n%s" "------ The body of the message is " OFF_T_FMT " characters long; only the first\n" "------ %d or so are included here.\n\n", rubric, statbuf.st_size, (max/1000)*1000); } - else fprintf(f, "\n%s\n", rubric); + else fprintf(fp, "\n%s\n", rubric); } - else fprintf(f, "\n%s\n", rubric); + else fprintf(fp, "\n%s\n", rubric); - fflush(f); + fflush(fp); transport_count = 0; transport_write_message(&tctx, bounce_return_size_limit); } /* End the message and wait for the child process to end; no timeout. */ -(void)fclose(f); +(void)fclose(fp); rc = child_close(pid, 0); /* Update the "sent to" log whatever the yield. This errs on the side of @@ -823,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); }