Skip to content

Commit c6ed6da

Browse files
committed
drm/uapi: Validate the mode flags/type
Currently userspace is allowed to feed in any king of garbage in the high bits of the mode flags/type, as are drivers when probing modes. Reject any mode with bogus flags/type. Hopefully this won't break any current userspace... v2: Split the type and flags checks to separates ifs (Chris) Cc: Chris Wilson <[email protected]> Cc: Jose Abreu <[email protected]> Cc: Adam Jackson <[email protected]> Cc: Keith Packard <[email protected]> Signed-off-by: Ville Syrjälä <[email protected]> Reviewed-by: Adam Jackson <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Reviewed-by: Alex Deucher <[email protected]>
1 parent 064a3e6 commit c6ed6da

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

drivers/gpu/drm/drm_modes.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,6 +1036,12 @@ EXPORT_SYMBOL(drm_mode_equal_no_clocks_no_stereo);
10361036
enum drm_mode_status
10371037
drm_mode_validate_basic(const struct drm_display_mode *mode)
10381038
{
1039+
if (mode->type & ~DRM_MODE_TYPE_ALL)
1040+
return MODE_BAD;
1041+
1042+
if (mode->flags & ~DRM_MODE_FLAG_ALL)
1043+
return MODE_BAD;
1044+
10391045
if ((mode->flags & DRM_MODE_FLAG_3D_MASK) > DRM_MODE_FLAG_3D_MAX)
10401046
return MODE_BAD;
10411047

include/uapi/drm/drm_mode.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,14 @@ extern "C" {
4646
#define DRM_MODE_TYPE_USERDEF (1<<5)
4747
#define DRM_MODE_TYPE_DRIVER (1<<6)
4848

49+
#define DRM_MODE_TYPE_ALL (DRM_MODE_TYPE_BUILTIN | \
50+
DRM_MODE_TYPE_CLOCK_C | \
51+
DRM_MODE_TYPE_CRTC_C | \
52+
DRM_MODE_TYPE_PREFERRED | \
53+
DRM_MODE_TYPE_DEFAULT | \
54+
DRM_MODE_TYPE_USERDEF | \
55+
DRM_MODE_TYPE_DRIVER)
56+
4957
/* Video mode flags */
5058
/* bit compatible with the xrandr RR_ definitions (bits 0-13)
5159
*
@@ -99,6 +107,22 @@ extern "C" {
99107
#define DRM_MODE_FLAG_PIC_AR_16_9 \
100108
(DRM_MODE_PICTURE_ASPECT_16_9<<19)
101109

110+
#define DRM_MODE_FLAG_ALL (DRM_MODE_FLAG_PHSYNC | \
111+
DRM_MODE_FLAG_NHSYNC | \
112+
DRM_MODE_FLAG_PVSYNC | \
113+
DRM_MODE_FLAG_NVSYNC | \
114+
DRM_MODE_FLAG_INTERLACE | \
115+
DRM_MODE_FLAG_DBLSCAN | \
116+
DRM_MODE_FLAG_CSYNC | \
117+
DRM_MODE_FLAG_PCSYNC | \
118+
DRM_MODE_FLAG_NCSYNC | \
119+
DRM_MODE_FLAG_HSKEW | \
120+
DRM_MODE_FLAG_BCAST | \
121+
DRM_MODE_FLAG_PIXMUX | \
122+
DRM_MODE_FLAG_DBLCLK | \
123+
DRM_MODE_FLAG_CLKDIV2 | \
124+
DRM_MODE_FLAG_3D_MASK)
125+
102126
/* DPMS flags */
103127
/* bit compatible with the xorg definitions. */
104128
#define DRM_MODE_DPMS_ON 0

0 commit comments

Comments
 (0)