[PATCH] apparmor: replace decompress_zstd() prototype with its entity
John Johansen
john.johansen at canonical.com
Wed Jul 15 23:18:48 UTC 2026
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 <georgia.garcia at canonical.com>
>>
>>> Reported-by: syzbot+1f14a35d0c73d31555e4 at syzkaller.appspotmail.com
>>> Closes: https://syzkaller.appspot.com/bug?extid=1f14a35d0c73d31555e4
>>> Fixes: 17b5758bf35c ("apparmor: Initial support for compressed policies")
>>> Signed-off-by: Tetsuo Handa <penguin-kernel at I-love.SAKURA.ne.jp>
>>> ---
>>> 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)
>>> {
>>
>
More information about the Linux-security-module-archive
mailing list