Re: [PATCH] apparmor: replace decompress_zstd() prototype with its entity
Tetsuo Handa <[email protected]> Thu, 16 Jul 2026 08:05:13 +0900
| Newsgroups | org.kernel.vger.linux-security-module |
|---|---|
| Message-ID | <[email protected]> |
Thank you. Please send to linux-next tree via apparmor tree, for syzbot won't be able to test linux-next tree due to this build failure. On 2026/07/15 21:14, Georgia Garcia wrote: > Hello, > > On Sun, 2026-07-12 at 19:17 +0900, Tetsuo Handa wrote: >> Fix "undefined symbol: decompress_zstd" error caused by decompress_zstd() >> being guarded by CONFIG_SECURITY_APPARMOR_EXPORT_BINARY=y. >> > > Acked-by: Georgia Garcia <[email protected]> > >> Reported-by: [email protected] >> Closes: https://syzkaller.appspot.com/bug?extid=1f14a35d0c73d31555e4 >> Fixes: 17b5758bf35c ("apparmor: Initial support for compressed policies") >> Signed-off-by: Tetsuo Handa <[email protected]> >> --- >> security/apparmor/apparmorfs.c | 72 +++++++++++++++++----------------- >> 1 file changed, 36 insertions(+), 36 deletions(-) >> >> diff --git a/security/apparmor/apparmorfs.c b/security/apparmor/apparmorfs.c >> index 2ae9ab94a5a91..152c7967ff1ba 100644 >> --- a/security/apparmor/apparmorfs.c >> +++ b/security/apparmor/apparmorfs.c >> @@ -483,7 +483,42 @@ static struct aa_loaddata *aa_simple_write_to_buffer(const char __user *userbuf, >> >> return data; >> } >> -static int decompress_zstd(char *src, size_t slen, char *dst, size_t dlen); >> + >> +static int decompress_zstd(char *src, size_t slen, char *dst, size_t dlen) >> +{ >> + if (slen < dlen) { >> + const size_t wksp_len = zstd_dctx_workspace_bound(); >> + zstd_dctx *ctx; >> + void *wksp; >> + size_t out_len; >> + int ret = 0; >> + >> + wksp = kvzalloc(wksp_len, GFP_KERNEL); >> + if (!wksp) { >> + ret = -ENOMEM; >> + goto cleanup; >> + } >> + ctx = zstd_init_dctx(wksp, wksp_len); >> + if (ctx == NULL) { >> + ret = -ENOMEM; >> + goto cleanup; >> + } >> + out_len = zstd_decompress_dctx(ctx, dst, dlen, src, slen); >> + if (zstd_is_error(out_len)) { >> + ret = -EINVAL; >> + goto cleanup; >> + } >> +cleanup: >> + kvfree(wksp); >> + return ret; >> + } >> + >> + if (dlen < slen) >> + return -EINVAL; >> + memcpy(dst, src, slen); >> + return 0; >> +} >> + >> /** >> * aa_get_data_from_compressed - common routine for getting compressed policy >> * from user and get both compressed and uncompressed version. >> @@ -1517,41 +1552,6 @@ SEQ_RAWDATA_FOPS(revision); >> SEQ_RAWDATA_FOPS(hash); >> SEQ_RAWDATA_FOPS(compressed_size); >> >> -static int decompress_zstd(char *src, size_t slen, char *dst, size_t dlen) >> -{ >> - if (slen < dlen) { >> - const size_t wksp_len = zstd_dctx_workspace_bound(); >> - zstd_dctx *ctx; >> - void *wksp; >> - size_t out_len; >> - int ret = 0; >> - >> - wksp = kvzalloc(wksp_len, GFP_KERNEL); >> - if (!wksp) { >> - ret = -ENOMEM; >> - goto cleanup; >> - } >> - ctx = zstd_init_dctx(wksp, wksp_len); >> - if (ctx == NULL) { >> - ret = -ENOMEM; >> - goto cleanup; >> - } >> - out_len = zstd_decompress_dctx(ctx, dst, dlen, src, slen); >> - if (zstd_is_error(out_len)) { >> - ret = -EINVAL; >> - goto cleanup; >> - } >> -cleanup: >> - kvfree(wksp); >> - return ret; >> - } >> - >> - if (dlen < slen) >> - return -EINVAL; >> - memcpy(dst, src, slen); >> - return 0; >> -} >> - >> static ssize_t rawdata_read(struct file *file, char __user *buf, size_t size, >> loff_t *ppos) >> { >