Re: [PATCH] apparmor: replace decompress_zstd() prototype with its entity
John Johansen <[email protected]> Wed, 15 Jul 2026 16:18:48 -0700
| Newsgroups | org.kernel.vger.linux-security-module |
|---|---|
| Organization | Canonical |
| Message-ID | <[email protected]> |
On 7/15/26 16:05, Tetsuo Handa wrote: > 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. > done, thanks Tetsuo > 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) >>> { >> >