X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/94759fce86e40abab9d6d98034e18707a87878eb..d12746bc15d83ab821be36975da0179672708bc1:/src/src/smtp_out.c diff --git a/src/src/smtp_out.c b/src/src/smtp_out.c index 1209c7fd9..9bd90c77a 100644 --- a/src/src/smtp_out.c +++ b/src/src/smtp_out.c @@ -512,34 +512,34 @@ int smtp_write_command(void * sx, int mode, const char *format, ...) { smtp_outblock * outblock = &((smtp_context *)sx)->outblock; -int count; int rc = 0; -va_list ap; if (format) { + gstring gs = { .size = big_buffer_size, .ptr = 0, .s = big_buffer }; + va_list ap; + va_start(ap, format); - if (!string_vformat(big_buffer, big_buffer_size, CS format, ap)) + if (!string_vformat(&gs, FALSE, CS format, ap)) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "overlong write_command in outgoing " "SMTP"); va_end(ap); - count = Ustrlen(big_buffer); + string_from_gstring(&gs); - if (count > outblock->buffersize) + if (gs.ptr > outblock->buffersize) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "overlong write_command in outgoing " "SMTP"); - if (count > outblock->buffersize - (outblock->ptr - outblock->buffer)) + if (gs.ptr > outblock->buffersize - (outblock->ptr - outblock->buffer)) { rc = outblock->cmd_count; /* flush resets */ if (!flush_buffer(outblock, SCMD_FLUSH)) return -1; } - Ustrncpy(CS outblock->ptr, big_buffer, count); - outblock->ptr += count; + Ustrncpy(CS outblock->ptr, gs.s, gs.ptr); + outblock->ptr += gs.ptr; outblock->cmd_count++; - count -= 2; - big_buffer[count] = 0; /* remove \r\n for error message */ + gs.ptr -= 2; string_from_gstring(&gs); /* remove \r\n for error message */ /* We want to hide the actual data sent in AUTH transactions from reflections and logs. While authenticating, a flag is set in the outblock to enable this.