[PATCH V3 5/7] weston:Add the weston randr protocol implementation
Hardening
rdp.effort at gmail.com
Wed Apr 9 00:59:48 PDT 2014
Le 08/04/2014 07:03, Quanxian Wang a écrit :
> Signed-off-by: Quanxian Wang <quanxian.wang at intel.com>
> ---
> module/Makefile.am | 3 +
> module/wrandr/Makefile.am | 32 ++
> module/wrandr/wrandr.c | 1262 +++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 1297 insertions(+)
> create mode 100644 module/Makefile.am
> create mode 100644 module/wrandr/Makefile.am
> create mode 100644 module/wrandr/wrandr.c
>
> diff --git a/module/Makefile.am b/module/Makefile.am
> new file mode 100644
> index 0000000..1a10e65
> --- /dev/null
> +++ b/module/Makefile.am
> @@ -0,0 +1,3 @@
> +SUBDIRS =
> +
> +SUBDIRS += wrandr
> diff --git a/module/wrandr/Makefile.am b/module/wrandr/Makefile.am
> new file mode 100644
> index 0000000..b0f2e6b
> --- /dev/null
> +++ b/module/wrandr/Makefile.am
> @@ -0,0 +1,32 @@
> +moduledir = $(libdir)/weston
> +module_LTLIBRARIES = $(wrandr)
> +
> +AM_CPPFLAGS = \
> + -I$(top_srcdir)/shared \
> + -I$(top_srcdir)/src \
> + -I$(top_builddir)/src \
> + -DDATADIR='"$(datadir)"' \
> + -DMODULEDIR='"$(moduledir)"' \
> + -DLIBEXECDIR='"$(libexecdir)"' \
> + -DIN_WESTON
> +
[...]
> +static void
> +update_region(struct weston_compositor *ec,
> + struct weston_output *target_output)
> +{
> + pixman_region32_t old_output_region;
> +
> + /* Update output region and transformation matrix. */
> + pixman_region32_init(&old_output_region);
> + pixman_region32_copy(&old_output_region, &target_output->region);
> + weston_output_transform_scale_init(target_output,
> + target_output->transform,
> + target_output->current_scale);
> +
> + pixman_region32_init(&target_output->previous_damage);
> + pixman_region32_init_rect(&target_output->region,
> + target_output->x, target_output->y,
> + target_output->width, target_output->height);
> +
> + weston_output_update_matrix(target_output);
> +
> + adjust_pointer(target_output, &old_output_region);
> + pixman_region32_fini(&old_output_region);
> +
> + /* Damage the output region in primary_plane */
> + pixman_region32_union(&ec->primary_plane.damage,
> + &ec->primary_plane.damage,
> + &target_output->region);
> +
> + target_output->dirty = 1;
> +}
> +
> +static void
> +randr_switch_mode(struct randr_output_request *request,
> + uint32_t *results)
> +{
> + time_t time = 0;
> + int i = 0, found = 0;
> + int result = WRANDR_TYPE_RET_NOACT;
> + int timing_mode = 0;
> + int move_bits = 0;
> + struct weston_mode *mode;
> + struct weston_output *output = request->output;
> +
> + if (request->flags & 1<<WRANDR_TYPE_OOP_MODENUM) {
> + timing_mode = 1;
> + time = request->modenum.modi_time;
> + *results |= result<<
> + (WRANDR_TYPE_OOP_MODENUM * 2);
> + }
> +
> + if (request->flags & 1<<WRANDR_TYPE_OOP_MODE) {
> + *results |= result<<
> + (WRANDR_TYPE_OOP_MODE * 2);
> + if (request->mode->modi_time > time) {
> + time = request->mode->modi_time;
> + timing_mode = 2;
> + }
> + }
[Hardening] Perhaps the case where request->flags has not bits set
should be treated with an error returned ?
> +
> + switch (timing_mode) {
> + case 1:
> + i = 0;
> + wl_list_for_each(mode, &output->mode_list, link) {
> + i++;
> + if (i == request->modenum.num) {
> + found = 1;
> + break;
> + }
> + }
> +
> + if (found != 1)
> + mode = NULL;
> + break;
> + case 2:
> + mode = randr_find_mode(output,
> + request->mode->width,
> + request->mode->height,
> + request->mode->refresh);
> + break;
> + default:
> + return;
> + }
[Hardening] related to my remark above, *results should be set in the
"default:" handling, as it catches the case where timing_mode == 0 which
means no flags where set.
> +
> +
> + if (!mode) {
> + result = WRANDR_TYPE_RET_FAIL;
> + } else {
> + if (!(mode->flags & WL_OUTPUT_MODE_CURRENT) &&
> + output->switch_mode) {
> + result = output->switch_mode(output, mode);
> + if (result < 0)
> + result = WRANDR_TYPE_RET_FAIL;
> + else
> + result = WRANDR_TYPE_RET_SUCCESS;
> + } else
> + result = WRANDR_TYPE_RET_NOACT;
> + }
> +
> + move_bits = WRANDR_TYPE_OOP_MODENUM + timing_mode - 1;
> + *results &= ~(RESULT_MASK<<(move_bits * 2));
> + *results |= result<<(move_bits * 2);
> +}
> +
>
[...]
Regards
--
David FORT
website: http://www.hardening-consulting.com/
More information about the wayland-devel
mailing list