From e5364fb364dbba951ec6aac804a32793079c92fb Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Wed, 14 Feb 2024 19:32:27 +0000 Subject: [PATCH] ZStd decompression context is not thread safe --- src/jit/jit-pack.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/jit/jit-pack.c b/src/jit/jit-pack.c index 8a46afee..1112aeba 100644 --- a/src/jit/jit-pack.c +++ b/src/jit/jit-pack.c @@ -44,6 +44,7 @@ struct _jit_pack { ZSTD_DCtx *zstd; const void *mmap; size_t map_size; + nvc_lock_t zlock; }; typedef struct _pack_writer { @@ -533,13 +534,17 @@ bool jit_pack_fill(jit_pack_t *jp, jit_t *j, jit_func_t *f) fatal("cannot get ZSTD compressed frame size: %s: %s", istr(f->name), ZSTD_getErrorName(framesz)); - size_t dsize = ZSTD_decompressDCtx(jp->zstd, ubuf, ubufsz, - pf->buf + start, framesz); - if (ZSTD_isError(dsize)) - fatal("ZSTD decompress failed: %s: %s", istr(f->name), - ZSTD_getErrorName(dsize)); + { + SCOPED_LOCK(jp->zlock); - assert(dsize == ubufsz); + size_t dsize = ZSTD_decompressDCtx(jp->zstd, ubuf, ubufsz, + pf->buf + start, framesz); + if (ZSTD_isError(dsize)) + fatal("ZSTD decompress failed: %s: %s", istr(f->name), + ZSTD_getErrorName(dsize)); + + assert(dsize == ubufsz); + } pf->rptr = ubuf; pf->last_loc = LOC_INVALID; -- 2.39.2