gpg: Fix minor memory leak in the compress filter.

* g10/compress.c (push_compress_filter2): Return an error if no filter
was pushed.
(push_compress_filter): Ditto.
(handle_compressed): Free CFX if no filter was pushed.
* g10/import.c (read_block): Ditto.
--

GnuPG-bug-id: 3898, 3930
Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2018-05-02 19:44:10 +02:00
parent f7f3043653
commit d26363e4f1
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
3 changed files with 21 additions and 9 deletions

View File

@ -319,7 +319,8 @@ handle_compressed (ctrl_t ctrl, void *procctx, PKT_compressed *cd,
cfx = xmalloc_clear (sizeof *cfx); cfx = xmalloc_clear (sizeof *cfx);
cfx->release = release_context; cfx->release = release_context;
cfx->algo = cd->algorithm; cfx->algo = cd->algorithm;
push_compress_filter(cd->buf,cfx,cd->algorithm); if (push_compress_filter(cd->buf, cfx, cd->algorithm))
xfree (cfx);
} }
if( callback ) if( callback )
rc = callback(cd->buf, passthru ); rc = callback(cd->buf, passthru );
@ -329,16 +330,20 @@ handle_compressed (ctrl_t ctrl, void *procctx, PKT_compressed *cd,
return rc; return rc;
} }
void gpg_error_t
push_compress_filter(IOBUF out,compress_filter_context_t *zfx,int algo) push_compress_filter(IOBUF out,compress_filter_context_t *zfx,int algo)
{ {
push_compress_filter2(out,zfx,algo,0); return push_compress_filter2(out,zfx,algo,0);
} }
void
/* Push a compress filter and return 0 if that succeeded. */
gpg_error_t
push_compress_filter2(IOBUF out,compress_filter_context_t *zfx, push_compress_filter2(IOBUF out,compress_filter_context_t *zfx,
int algo,int rel) int algo,int rel)
{ {
gpg_error_t err = gpg_error (GPG_ERR_FALSE);
if(algo>=0) if(algo>=0)
zfx->algo=algo; zfx->algo=algo;
else else
@ -353,16 +358,20 @@ push_compress_filter2(IOBUF out,compress_filter_context_t *zfx,
case COMPRESS_ALGO_ZIP: case COMPRESS_ALGO_ZIP:
case COMPRESS_ALGO_ZLIB: case COMPRESS_ALGO_ZLIB:
iobuf_push_filter2(out,compress_filter,zfx,rel); iobuf_push_filter2(out,compress_filter,zfx,rel);
err = 0;
break; break;
#endif #endif
#ifdef HAVE_BZIP2 #ifdef HAVE_BZIP2
case COMPRESS_ALGO_BZIP2: case COMPRESS_ALGO_BZIP2:
iobuf_push_filter2(out,compress_filter_bz2,zfx,rel); iobuf_push_filter2(out,compress_filter_bz2,zfx,rel);
err = 0;
break; break;
#endif #endif
default: default:
BUG(); BUG();
} }
return err;
} }

View File

@ -140,9 +140,10 @@ void unarmor_pump_release (UnarmorPump x);
int unarmor_pump (UnarmorPump x, int c); int unarmor_pump (UnarmorPump x, int c);
/*-- compress.c --*/ /*-- compress.c --*/
void push_compress_filter(iobuf_t out,compress_filter_context_t *zfx,int algo); gpg_error_t push_compress_filter (iobuf_t out, compress_filter_context_t *zfx,
void push_compress_filter2(iobuf_t out,compress_filter_context_t *zfx, int algo);
int algo,int rel); gpg_error_t push_compress_filter2 (iobuf_t out,compress_filter_context_t *zfx,
int algo, int rel);
/*-- cipher.c --*/ /*-- cipher.c --*/
int cipher_filter( void *opaque, int control, int cipher_filter( void *opaque, int control,

View File

@ -767,7 +767,7 @@ valid_keyblock_packet (int pkttype)
* Meta data (ring trust packets) are only considered of WITH_META is set. * Meta data (ring trust packets) are only considered of WITH_META is set.
* PENDING_PKT should be initialized to NULL and not changed by the caller. * PENDING_PKT should be initialized to NULL and not changed by the caller.
* Return: 0 = okay, -1 no more blocks or another errorcode. * Return: 0 = okay, -1 no more blocks or another errorcode.
* The int at at R_V3KEY counts the number of unsupported v3 * The int at R_V3KEY counts the number of unsupported v3
* keyblocks. * keyblocks.
*/ */
static int static int
@ -856,7 +856,9 @@ read_block( IOBUF a, int with_meta,
{ {
compress_filter_context_t *cfx = xmalloc_clear( sizeof *cfx ); compress_filter_context_t *cfx = xmalloc_clear( sizeof *cfx );
pkt->pkt.compressed->buf = NULL; pkt->pkt.compressed->buf = NULL;
push_compress_filter2(a,cfx,pkt->pkt.compressed->algorithm,1); if (push_compress_filter2 (a, cfx,
pkt->pkt.compressed->algorithm, 1))
xfree (cfx); /* e.g. in case of compression_algo NONE. */
} }
free_packet (pkt, &parsectx); free_packet (pkt, &parsectx);
init_packet(pkt); init_packet(pkt);