1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-06-08 23:37:47 +02:00

gpg: Fix assertion failure due to errors in encrypt_filter.

* common/iobuf.c (iobuf_copy): Use log_assert.  Explicitly cast error
return value.
* g10/build-packet.c (do_plaintext): Check for iobuf_copy error.

* g10/encrypt.c (encrypt_filter): Immediately set header_okay.
--

Fixes-commit: 8066f8a347
which caused the assertion failure on error.

The second fix avoids repeated error message about non-compliant keys.

GnuPG-bug-id: 6174
This commit is contained in:
Werner Koch 2022-08-31 13:35:41 +02:00
parent f88cb12f8e
commit aa0c942521
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
3 changed files with 9 additions and 6 deletions

View File

@ -2201,7 +2201,7 @@ iobuf_temp_to_buffer (iobuf_t a, byte * buffer, size_t buflen)
/* Copies the data from the input iobuf SOURCE to the output iobuf /* Copies the data from the input iobuf SOURCE to the output iobuf
DEST until either an error is encountered or EOF is reached. DEST until either an error is encountered or EOF is reached.
Returns the number of bytes copies. */ Returns the number of bytes copies or (size_t)(-1) on error. */
size_t size_t
iobuf_copy (iobuf_t dest, iobuf_t source) iobuf_copy (iobuf_t dest, iobuf_t source)
{ {
@ -2214,11 +2214,11 @@ iobuf_copy (iobuf_t dest, iobuf_t source)
size_t max_read = 0; size_t max_read = 0;
int err; int err;
assert (source->use == IOBUF_INPUT || source->use == IOBUF_INPUT_TEMP); log_assert (source->use == IOBUF_INPUT || source->use == IOBUF_INPUT_TEMP);
assert (dest->use == IOBUF_OUTPUT || source->use == IOBUF_OUTPUT_TEMP); log_assert (dest->use == IOBUF_OUTPUT || source->use == IOBUF_OUTPUT_TEMP);
if (iobuf_error (dest)) if (iobuf_error (dest))
return -1; return (size_t)(-1);
temp = xmalloc (temp_size); temp = xmalloc (temp_size);
while (1) while (1)

View File

@ -753,6 +753,9 @@ do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt )
if (pt->buf) if (pt->buf)
{ {
nbytes = iobuf_copy (out, pt->buf); nbytes = iobuf_copy (out, pt->buf);
if (nbytes == (size_t)(-1)
&& (iobuf_error (out) || iobuf_error (pt->buf)))
return iobuf_error (out)? iobuf_error (out):iobuf_error (pt->buf);
if(ctb_new_format_p (ctb) && !pt->len) if(ctb_new_format_p (ctb) && !pt->len)
/* Turn off partial body length mode. */ /* Turn off partial body length mode. */
iobuf_set_partial_body_length_mode (out, 0); iobuf_set_partial_body_length_mode (out, 0);

View File

@ -878,6 +878,8 @@ encrypt_filter (void *opaque, int control,
{ {
if ( !efx->header_okay ) if ( !efx->header_okay )
{ {
efx->header_okay = 1;
efx->cfx.dek = create_dek_with_warnings (0, efx->pk_list); efx->cfx.dek = create_dek_with_warnings (0, efx->pk_list);
rc = check_encryption_compliance (efx->cfx.dek, efx->pk_list); rc = check_encryption_compliance (efx->cfx.dek, efx->pk_list);
@ -904,8 +906,6 @@ encrypt_filter (void *opaque, int control,
} }
iobuf_push_filter (a, cipher_filter_cfb, &efx->cfx); iobuf_push_filter (a, cipher_filter_cfb, &efx->cfx);
efx->header_okay = 1;
} }
rc = iobuf_write (a, buf, size); rc = iobuf_write (a, buf, size);