dri-devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Alan Mackenzie" <acm@muc.de>
Cc: dri-devel@lists.freedesktop.org, linux-serial@vger.kernel.org
Subject: Re: [Patch 8/9]: vt: Enhancements to the VT ioctl interface
Date: Thu, 27 Aug 2026 19:25:34 +0000	[thread overview]
Message-ID: <20260827192535.33F041F00A3D@smtp.kernel.org> (raw)
In-Reply-To: <apCIXtwoPY_a3QOi@MAC.fritz.box>

Thank you for your contribution! Sashiko AI review found 5 potential issue(s) to consider:
- [High] Downgrading user-sized allocations from kvmalloc-backed routines to kmalloc_array breaks legitimate large requests and allows an unprivileged user to exhaust memory or flood the kernel log.
- [High] Missing compat ioctl handlers for the newly introduced `PIO_UNIMAP21` and `GIO_UNIMAP21` commands breaks UAPI for 32-bit applications.
- [High] Uninitialized kernel stack memory leaked to userspace when CONFIG_CONSOLE_TRANSLATIONS is disabled.
- [Medium] Required buffer size is silently truncated in the legacy 16-bit GET ioctl if the dictionary exceeds 65535 entries.
- [Low] Incompatible pointer types passed to fallback dummy functions break the build when CONFIG_CONSOLE_TRANSLATIONS is disabled.
--

commit 50062db5106d84e65d87483ac16b8d41dbdd6175
Author: Alan Mackenzie <acm@muc.de>

    vt: Enhancements to the VT ioctl interface
    
    Handle the current 16-bit P/GIO_UNIMAP ioctls by converting
    to/from 32-bit code-points/glyph numbers.  Add handling for new
    32-bit ioctls P/GIO_UNIMAP21.  Convert to and from __user in
    vt_ioctl.c rather than in vt.c or consolemap.c.

> diff --git a/drivers/tty/vt/vt_ioctl.c b/drivers/tty/vt/vt_ioctl.c
> index 28993a3d0acb6..05986430e1bb3 100644
> --- a/drivers/tty/vt/vt_ioctl.c
> +++ b/drivers/tty/vt/vt_ioctl.c

[ ... ]

> @@ -484,10 +484,155 @@ static int vt_k_ioctl(struct tty_struct *tty, unsigned int cmd,
>  	return 0;
>  }
>  
> +#ifdef CONFIG_FB_GLYPH_21BIT
> +static int vt__user_unipair_8_to_21(unsigned int ct,
> +				    struct unipair __user *entries,
> +				    struct unipair21 **tmp21_entries)
> +{
> +	struct unipair *tmp_entries;
> +	int i, ret = 0;
> +
> +	tmp_entries = kmalloc_array(ct, sizeof(struct unipair), GFP_KERNEL);
> +	if (!tmp_entries)
> +		return -ENOMEM;
> +	if (copy_from_user(tmp_entries, entries, ct * sizeof(struct unipair))) {
> +		ret = -EFAULT;
> +		goto free_tmp;
> +	}
> +	*tmp21_entries = kmalloc_array(ct, sizeof(struct unipair21), GFP_KERNEL);

[Severity: High]
Could these unbounded allocations fail or cause page allocator warnings? A full
legacy map (65535 entries) requires an order-7 allocation for `tmp21_entries`
(524KB), which might spuriously fail without a vmalloc fallback. Additionally,
does this allow an unprivileged user to exhaust memory or flood the kernel log
by providing large `ct` values without `__GFP_NOWARN`?

> +	if (!*tmp21_entries) {
> +		ret = -ENOMEM;
> +		goto free_tmp;
> +	}

[ ... ]

> +static inline int do_unimap_ioctl(int cmd, struct unimapdesc __user *user_ud,
> +		bool perm, struct vc_data *vc)
> +{
> +	struct unimapdesc tmp;
> +	struct unipair21 *tmp21_entries = NULL;
> +	int ret = 0, ret1 = 0;
> +	unsigned int ct;
> +
> +	if (copy_from_user(&tmp, user_ud, sizeof(tmp)))
> +		return -EFAULT;
> +	switch (cmd) {

[ ... ]

> +	case GIO_UNIMAP:
> +		if (!perm && fg_console != vc->vc_num)
> +			return -EPERM;
> +		tmp21_entries = kmalloc_array(tmp.entry_ct,
> +					      sizeof(struct unipair21),
> +					      GFP_KERNEL);
> +		if (!tmp21_entries)
> +			return -ENOMEM;
> +		ret = con_get_unimap(vc, tmp.entry_ct, &ct, tmp21_entries);
> +		if (ret)
> +			goto free_tmp21;
> +		ret = vt_unipair_21_to__user_8(ct, tmp21_entries, tmp.entries);
> +free_tmp21:	ret1 = put_user(ct, &user_ud->entry_ct);

[Severity: High]
If CONFIG_CONSOLE_TRANSLATIONS is disabled, the dummy `con_get_unimap` inline
returns `-EINVAL` without initializing `ct`. Does this result in uninitialized
kernel stack memory leaking to userspace when `ct` is copied by `put_user()`
on the error path?

[Severity: Medium]
Also, could this silently truncate the required buffer size if the dictionary
exceeds 65535 entries? The 32-bit accurate size `ct` is written to a 16-bit
`user_ud->entry_ct`, causing legacy applications reading the map via GIO_UNIMAP
to receive an incorrect, truncated size and fail to allocate a sufficient buffer.

> +		kfree(tmp21_entries);
> +		return ret ? ret : ret1;
> +	}
> +	return 0;
> +}
> +
> +static inline int do_unimap_ioctl21(int cmd, struct unimapdesc21 __user *user_ud,
> +		bool perm, struct vc_data *vc)
> +{
> +	struct unimapdesc21 tmp;
> +	struct unipair21 *k_entries;
> +	int ret = 0, ret1 = 0;
> +
> +	if (copy_from_user(&tmp, user_ud, sizeof(tmp)))
> +		return -EFAULT;
> +	switch (cmd) {
> +	case PIO_UNIMAP21:
> +		if (!perm)
> +			return -EPERM;
> +		k_entries = kmalloc_array(tmp.entry_ct,
> +					  sizeof(struct unipair21),
> +					  GFP_KERNEL);

[Severity: High]
Does this allow unbounded allocations similar to `vt__user_unipair_8_to_21()`?
Passing an unbounded user-provided size `tmp.entry_ct` to `kmalloc_array`
without `__GFP_NOWARN` could allow an unprivileged user to trigger page
allocator warnings and exhaust memory. Furthermore, `con_set_unimap()`
propagates this count to `dict->count`, leading to additional unbounded
`kmalloc` allocations in `set_inverse_transl()`.

[ ... ]

> @@ -1026,16 +1203,20 @@ compat_kdfontop_ioctl(struct compat_console_font_op __user *fontop,
>  }
>  
>  struct compat_unimapdesc {
> -	unsigned short entry_ct;
> +	u16 entry_ct;
>  	compat_caddr_t entries;
>  };
>  
> +#ifdef CONFIG_FB_GLYPH_21BIT
>  static inline int
>  compat_unimap_ioctl(unsigned int cmd, struct compat_unimapdesc __user *user_ud,
>  			 int perm, struct vc_data *vc)
>  {

[Severity: High]
Are we missing compat ioctl handlers for `PIO_UNIMAP21` and `GIO_UNIMAP21`?
`struct unimapdesc21` contains a pointer, so its layout differs between 32-bit
and 64-bit architectures (8 bytes vs 16 bytes). Without explicit handling in
`vt_compat_ioctl()`, 32-bit processes on 64-bit kernels will fail to invoke
these new ioctls and receive -ENOIOCTLCMD or -ENOTTY.

[ ... ]

> diff --git a/include/linux/vt_kern.h b/include/linux/vt_kern.h
> index e017588979194..af99aeefe177f 100644
> --- a/include/linux/vt_kern.h
> +++ b/include/linux/vt_kern.h
> @@ -96,13 +96,13 @@ static inline int con_clear_unimap(struct vc_data *vc)
>  	return 0;
>  }
>  static inline
> -int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list)
> +int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair *list)

[Severity: Low]
Will this break the build when CONFIG_CONSOLE_TRANSLATIONS is disabled?
The fallback dummy function for `con_set_unimap` expects a `struct unipair *`,
but the callers in `vt_ioctl.c` under `CONFIG_FB_GLYPH_21BIT` (like
`do_unimap_ioctl21`) pass `struct unipair21 *`, which violates strict type
checking.

>  {
>  	return 0;
>  }

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/apCEDM2sWv_M354-@MAC.fritz.box?part=8

  reply	other threads:[~2026-08-27 19:25 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-27 18:38 vt: Enlarge the framebuffer glyph size from 16 to 32 bits Alan Mackenzie
2026-08-27 18:42 ` [Patch 1/9]: Make consolemap.c handle Unicode planes outside BMP Alan Mackenzie
2026-08-27 19:14   ` sashiko-bot
2026-08-28  4:57   ` Jiri Slaby
2026-08-29 11:51     ` Alan Mackenzie
2026-08-27 18:45 ` [Patch 2/9]: Glyph size: Use GLYPH_SZ/HW rather than hardcoded 2, 1 Alan Mackenzie
2026-08-27 19:22   ` sashiko-bot
2026-08-27 18:47 ` [Patch 3/9]: Replace scr_readw/writew by scr_readg/writeg, etc Alan Mackenzie
2026-08-27 19:18   ` sashiko-bot
2026-08-29 12:11   ` Greg Kroah-Hartman
2026-08-29 13:33     ` Alan Mackenzie
2026-08-27 18:48 ` [Patch 4/9]: Amend internal manipulation of glyph structure Alan Mackenzie
2026-08-27 19:19   ` sashiko-bot
2026-08-27 18:50 ` [Patch 5/9]: vt: Amend three Kconfig files Alan Mackenzie
2026-08-27 19:12   ` sashiko-bot
2026-08-27 18:52 ` [Patch 6/9]: vt: Use u32 and typedef u1632 to handle whole glyphs Alan Mackenzie
2026-08-27 19:22   ` sashiko-bot
2026-08-27 18:54 ` [Patch 7/9]: vt: Handle up to 2^21 glyphs, rather than 256/512 Alan Mackenzie
2026-08-27 19:14   ` sashiko-bot
2026-08-27 18:56 ` [Patch 8/9]: vt: Enhancements to the VT ioctl interface Alan Mackenzie
2026-08-27 19:25   ` sashiko-bot [this message]
2026-08-27 18:58 ` [Patch 9/9]: vt: Misc changes, e.g. to #include directives Alan Mackenzie
2026-08-27 19:25   ` sashiko-bot
2026-08-29 12:06   ` Greg Kroah-Hartman
2026-08-28  6:12 ` vt: Enlarge the framebuffer glyph size from 16 to 32 bits Thomas Zimmermann
2026-08-28 14:36   ` Alan Mackenzie
2026-08-29 12:09     ` Greg Kroah-Hartman
2026-08-29 14:39       ` Alan Mackenzie
2026-08-31  6:20         ` Thomas Zimmermann
2026-08-31 14:45           ` Alan Mackenzie
2026-08-31 17:21             ` Helge Deller
2026-09-01 11:14               ` Alan Mackenzie

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260827192535.33F041F00A3D@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=acm@muc.de \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=linux-serial@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox