mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01:00
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:
parent
f7f3043653
commit
d26363e4f1
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user