Skip to content

Commit

Permalink
Merge pull request #355 from sebres/fix-mem-leak-brotlimt
Browse files Browse the repository at this point in the history
Fix memory leak in brotlimt
  • Loading branch information
mcmilk authored Oct 10, 2023
2 parents ce27b4a + fa7e631 commit 79b2c78
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 9 deletions.
9 changes: 9 additions & 0 deletions C/zstdmt/brotli-mt_compress.c
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,15 @@ size_t BROTLIMT_compressCCtx(BROTLIMT_CCtx * ctx, BROTLIMT_RdWr_t * rdwr)
retval_of_thread = p;
}

/* move remaining done/busy entries to free list */
while (!list_empty(&ctx->writelist_done)) {
struct list_head *entry = list_first(&ctx->writelist_done);
list_move(entry, &ctx->writelist_free);
}
while (!list_empty(&ctx->writelist_busy)) {
struct list_head* entry = list_first(&ctx->writelist_busy);
list_move(entry, &ctx->writelist_free);
}
/* clean up lists */
while (!list_empty(&ctx->writelist_free)) {
struct writelist *wl;
Expand Down
22 changes: 13 additions & 9 deletions C/zstdmt/brotli-mt_decompress.c
Original file line number Diff line number Diff line change
Expand Up @@ -363,12 +363,7 @@ static void *pt_decompress(void *arg)
}

/* everything is okay */
pthread_mutex_lock(&ctx->write_mutex);
list_move(&wl->node, &ctx->writelist_free);
pthread_mutex_unlock(&ctx->write_mutex);
if (in->allocated)
free(in->buf);
return 0;
result = 0;

error_lock:
pthread_mutex_lock(&ctx->write_mutex);
Expand Down Expand Up @@ -508,8 +503,8 @@ size_t BROTLIMT_decompressDCtx(BROTLIMT_DCtx * ctx, BROTLIMT_RdWr_t * rdwr)
/* no pthread_create() needed! */
void *p = pt_decompress(w);
if (p)
return (size_t) p;
goto okay;
retval_of_thread = p;
goto done;
}

/* multi threaded */
Expand All @@ -530,7 +525,16 @@ size_t BROTLIMT_decompressDCtx(BROTLIMT_DCtx * ctx, BROTLIMT_RdWr_t * rdwr)
retval_of_thread = p;
}

okay:
done:
/* move remaining done/busy entries to free list */
while (!list_empty(&ctx->writelist_done)) {
struct list_head *entry = list_first(&ctx->writelist_done);
list_move(entry, &ctx->writelist_free);
}
while (!list_empty(&ctx->writelist_busy)) {
struct list_head* entry = list_first(&ctx->writelist_busy);
list_move(entry, &ctx->writelist_free);
}
/* clean up the buffers */
while (!list_empty(&ctx->writelist_free)) {
struct writelist *wl;
Expand Down

0 comments on commit 79b2c78

Please sign in to comment.