From 583b664a07b41ba6991f87a811ab933990457063 Mon Sep 17 00:00:00 2001 From: Jussi Kivilinna Date: Sun, 13 Feb 2022 15:07:49 +0200 Subject: [PATCH] g10/plaintext: disable estream buffering in binary mode * g10/plaintext.c (handle_plaintext): Disable estream buffering in binary modes. -- Since in binary mode, large buffers are passed from source iobuf to target estream, extra buffering in estream only causes extra memory copying and overhead. GnuPG-bug-id: T5828 Signed-off-by: Jussi Kivilinna --- g10/plaintext.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/g10/plaintext.c b/g10/plaintext.c index a1bbbd95f..5c21dd7f6 100644 --- a/g10/plaintext.c +++ b/g10/plaintext.c @@ -292,7 +292,22 @@ handle_plaintext (PKT_plaintext * pt, md_filter_context_t * mfx, else /* Binary mode. */ { size_t temp_size = iobuf_set_buffer_size(0) * 1024; - byte *buffer = xmalloc (temp_size); + byte *buffer; + + if (fp) + { + /* Disable buffering in estream as we are passing large + * buffers to es_fwrite. */ + es_setbuf (fp, NULL); + } + + buffer = xmalloc (temp_size); + if (!buffer) + { + err = gpg_error_from_syserror (); + goto leave; + } + while (pt->len) { int len = pt->len > temp_size ? temp_size : pt->len; @@ -371,6 +386,13 @@ handle_plaintext (PKT_plaintext * pt, md_filter_context_t * mfx, byte *buffer; int eof_seen = 0; + if (fp) + { + /* Disable buffering in estream as we are passing large + * buffers to es_fwrite. */ + es_setbuf (fp, NULL); + } + buffer = xtrymalloc (temp_size); if (!buffer) {