diff mbox

Prevent zero sized wl_egl_window

Message ID 1392250871-3224-1-git-send-email-sinclair.yeh@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Sinclair Yeh Feb. 13, 2014, 12:21 a.m. UTC
It is illegal to create or resize a window to zero (or negative) width
and/or height.  This patch prevents such a request from happening.
---
 src/egl/wayland/wayland-egl/wayland-egl.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Pekka Paalanen Feb. 13, 2014, 8:11 a.m. UTC | #1
On Wed, 12 Feb 2014 16:21:11 -0800
Sinclair Yeh <sinclair.yeh@intel.com> wrote:

> It is illegal to create or resize a window to zero (or negative) width
> and/or height.  This patch prevents such a request from happening.
> ---
>  src/egl/wayland/wayland-egl/wayland-egl.c | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/src/egl/wayland/wayland-egl/wayland-egl.c
> b/src/egl/wayland/wayland-egl/wayland-egl.c index 8bd49cf..ae78595
> 100644 --- a/src/egl/wayland/wayland-egl/wayland-egl.c
> +++ b/src/egl/wayland/wayland-egl/wayland-egl.c
> @@ -9,6 +9,9 @@ wl_egl_window_resize(struct wl_egl_window *egl_window,
>  		     int width, int height,
>  		     int dx, int dy)
>  {
> +	if (width <= 0 || height <= 0)
> +		return;
> +

The below seems fine, but I wonder if we could make this one cause an
error to be returned later where we can, rather than silently ignoring.
I'm not sure where or how, though.

Surely drivers have maximum size limits, too, those must be catched
somewhere already.

>  	egl_window->width  = width;
>  	egl_window->height = height;
>  	egl_window->dx     = dx;
> @@ -24,6 +27,9 @@ wl_egl_window_create(struct wl_surface *surface,
>  {
>  	struct wl_egl_window *egl_window;
>  
> +	if (width <= 0 || height <= 0)
> +		return NULL;
> +
>  	egl_window = malloc(sizeof *egl_window);
>  	if (!egl_window)
>  		return NULL;

Thanks,
pq
Sinclair Yeh Feb. 13, 2014, 6:18 p.m. UTC | #2
> The below seems fine, but I wonder if we could make this one cause an
> error to be returned later where we can, rather than silently ignoring.
> I'm not sure where or how, though.

Would it make sense to change wl_egl_window_resize() so that it return a
value?  Either that, or it should be documented somewhere in the API
spec that setting width/height <=0 will be ignored.


> 
> Surely drivers have maximum size limits, too, those must be catched
> somewhere already.
> 
> >  	egl_window->width  = width;
> >  	egl_window->height = height;
> >  	egl_window->dx     = dx;
> > @@ -24,6 +27,9 @@ wl_egl_window_create(struct wl_surface *surface,
> >  {
> >  	struct wl_egl_window *egl_window;
> >  
> > +	if (width <= 0 || height <= 0)
> > +		return NULL;
> > +
> >  	egl_window = malloc(sizeof *egl_window);
> >  	if (!egl_window)
> >  		return NULL;
> 
> Thanks,
> pq
> _______________________________________________
> wayland-devel mailing list
> wayland-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Pekka Paalanen Feb. 14, 2014, 7:31 a.m. UTC | #3
On Thu, 13 Feb 2014 18:18:23 +0000
"Yeh, Sinclair" <sinclair.yeh@intel.com> wrote:

> > The below seems fine, but I wonder if we could make this one cause an
> > error to be returned later where we can, rather than silently ignoring.
> > I'm not sure where or how, though.
> 
> Would it make sense to change wl_egl_window_resize() so that it return a
> value?  Either that, or it should be documented somewhere in the API
> spec that setting width/height <=0 will be ignored.

I'm not sure we can change the function signature, it's public stable
ABI.

> > Surely drivers have maximum size limits, too, those must be catched
> > somewhere already.

But this might be worth looking into: if the window system produces a
bad size, what do drivers do when they cannot allocate or render to it?

In X11 it's all hidden from the app, but I don't think the gfx stack can
guarantee valid sizes in all cases, can it?

Anyway, my suggestion is just for convenience, and if drivers already
just silently do whatever on a bad size, being silent here does not
make it any worse.


Thanks,
pq

> > 
> > >  	egl_window->width  = width;
> > >  	egl_window->height = height;
> > >  	egl_window->dx     = dx;
> > > @@ -24,6 +27,9 @@ wl_egl_window_create(struct wl_surface *surface,
> > >  {
> > >  	struct wl_egl_window *egl_window;
> > >  
> > > +	if (width <= 0 || height <= 0)
> > > +		return NULL;
> > > +
> > >  	egl_window = malloc(sizeof *egl_window);
> > >  	if (!egl_window)
> > >  		return NULL;
> > 
> > Thanks,
> > pq
> > _______________________________________________
> > wayland-devel mailing list
> > wayland-devel@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
Kristian Høgsberg Feb. 18, 2014, 10:25 p.m. UTC | #4
On Fri, Feb 14, 2014 at 09:31:45AM +0200, Pekka Paalanen wrote:
> On Thu, 13 Feb 2014 18:18:23 +0000
> "Yeh, Sinclair" <sinclair.yeh@intel.com> wrote:
> 
> > > The below seems fine, but I wonder if we could make this one cause an
> > > error to be returned later where we can, rather than silently ignoring.
> > > I'm not sure where or how, though.
> > 
> > Would it make sense to change wl_egl_window_resize() so that it return a
> > value?  Either that, or it should be documented somewhere in the API
> > spec that setting width/height <=0 will be ignored.
> 
> I'm not sure we can change the function signature, it's public stable
> ABI.
> 
> > > Surely drivers have maximum size limits, too, those must be catched
> > > somewhere already.
> 
> But this might be worth looking into: if the window system produces a
> bad size, what do drivers do when they cannot allocate or render to it?
> 
> In X11 it's all hidden from the app, but I don't think the gfx stack can
> guarantee valid sizes in all cases, can it?
> 
> Anyway, my suggestion is just for convenience, and if drivers already
> just silently do whatever on a bad size, being silent here does not
> make it any worse.

We could maybe make it raise an EGL error, I'm a little concerned with how
this silently fails.  However, the behavior with Sinclairs patch is 
better than what we had before, so I've pushed that.

> Thanks,
> pq
> 
> > > 
> > > >  	egl_window->width  = width;
> > > >  	egl_window->height = height;
> > > >  	egl_window->dx     = dx;
> > > > @@ -24,6 +27,9 @@ wl_egl_window_create(struct wl_surface *surface,
> > > >  {
> > > >  	struct wl_egl_window *egl_window;
> > > >  
> > > > +	if (width <= 0 || height <= 0)
> > > > +		return NULL;
> > > > +
> > > >  	egl_window = malloc(sizeof *egl_window);
> > > >  	if (!egl_window)
> > > >  		return NULL;
> > > 
> > > Thanks,
> > > pq
> > > _______________________________________________
> > > wayland-devel mailing list
> > > wayland-devel@lists.freedesktop.org
> > > http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> > 
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
diff mbox

Patch

diff --git a/src/egl/wayland/wayland-egl/wayland-egl.c b/src/egl/wayland/wayland-egl/wayland-egl.c
index 8bd49cf..ae78595 100644
--- a/src/egl/wayland/wayland-egl/wayland-egl.c
+++ b/src/egl/wayland/wayland-egl/wayland-egl.c
@@ -9,6 +9,9 @@  wl_egl_window_resize(struct wl_egl_window *egl_window,
 		     int width, int height,
 		     int dx, int dy)
 {
+	if (width <= 0 || height <= 0)
+		return;
+
 	egl_window->width  = width;
 	egl_window->height = height;
 	egl_window->dx     = dx;
@@ -24,6 +27,9 @@  wl_egl_window_create(struct wl_surface *surface,
 {
 	struct wl_egl_window *egl_window;
 
+	if (width <= 0 || height <= 0)
+		return NULL;
+
 	egl_window = malloc(sizeof *egl_window);
 	if (!egl_window)
 		return NULL;