[PATCH weston v2 3/3] ivi-shell: use zalloc instead of calloc

Ucan, Emre (ADITG/SW1) eucan at de.adit-jv.com
Wed Nov 9 10:37:36 UTC 2016


Hi Pekka,

Thank you for your comment. You are right with your findings.

I will send a new patch to fix this issue.

Best regards

Emre Ucan
Software Group I (ADITG/SW1)

Tel. +49 5121 49 6937

> -----Original Message-----
> From: Pekka Paalanen [mailto:ppaalanen at gmail.com]
> Sent: Mittwoch, 9. November 2016 11:32
> To: Yong Bakos; Ucan, Emre (ADITG/SW1)
> Cc: wayland-devel
> Subject: Re: [PATCH weston v2 3/3] ivi-shell: use zalloc instead of calloc
> 
> On Thu, 28 Jul 2016 10:23:00 -0700
> Yong Bakos <junk at humanoriented.com> wrote:
> 
> > Hi Emre,
> >
> > > On Jul 28, 2016, at 7:14 AM, Ucan, Emre (ADITG/SW1) <eucan at de.adit-
> jv.com> wrote:
> > >
> > > v2 changes:
> > > - use xzalloc
> > > - add an explicit include of xalloc.h in any .c file
> > >  that uses xzalloc.
> > >
> > > Signed-off-by: Emre Ucan <eucan at de.adit-jv.com>
> >
> > Is the intent of this patch to cause an exit() when memory allocation fails?
> > See my comments inline below.
> 
> Hi,
> 
> thanks for the comments, my replies below.
> 
> > > ---
> > > ivi-shell/hmi-controller.c        |   35 ++++++++------------
> > > ivi-shell/input-panel-ivi.c       |    6 ++--
> > > ivi-shell/ivi-layout-transition.c |   62 +++++++----------------------------
> > > ivi-shell/ivi-layout.c            |   65 +++++++------------------------------
> > > 4 files changed, 38 insertions(+), 130 deletions(-)
> 
> > > diff --git a/ivi-shell/input-panel-ivi.c b/ivi-shell/input-panel-ivi.c
> > > index 581b56b..a563e31 100644
> > > --- a/ivi-shell/input-panel-ivi.c
> > > +++ b/ivi-shell/input-panel-ivi.c
> > > @@ -35,6 +35,7 @@
> > > #include "input-method-unstable-v1-server-protocol.h"
> > > #include "ivi-layout-private.h"
> > > #include "shared/helpers.h"
> > > +#include "shared/xalloc.h"
> > >
> > > struct input_panel_surface {
> > > 	struct wl_resource *resource;
> > > @@ -236,10 +237,7 @@ create_input_panel_surface(struct ivi_shell
> *shell,
> > > {
> > > 	struct input_panel_surface *input_panel_surface;
> > >
> > > -	input_panel_surface = calloc(1, sizeof *input_panel_surface);
> > > -	if (!input_panel_surface)
> > > -		return NULL;
> > > -
> > > +	input_panel_surface = xzalloc(sizeof *input_panel_surface);
> >
> > This seems like a change in behavior. When calloc fails, this function
> > will return NULL, triggering wl_resource_post_error at all call sites.
> > After this change, when xzalloc fails, fail_on_null will call exit().
> >
> > Just pointing this out in case it's not what you intended. (And if it is
> > intentional, it should be explained in the commit message.)
> 
> That's an excellent notice. However, I'll let is pass, since ivi-shell
> is full of exit-on-OOM cases and I don't think it has been seriously
> looked at. If it's important, it can be fixed in a follow-up. It's just
> a fixed-size struct alloc here.
> 
> > > 	surface->configure = input_panel_configure;
> > > 	surface->configure_private = input_panel_surface;
> > > 	weston_surface_set_label_func(surface, input_panel_get_label);
> > > diff --git a/ivi-shell/ivi-layout-transition.c b/ivi-shell/ivi-layout-transition.c
> > > index 989ba71..1175743 100644
> > > --- a/ivi-shell/ivi-layout-transition.c
> > > +++ b/ivi-shell/ivi-layout-transition.c
> > > @@ -35,6 +35,8 @@
> > > #include "ivi-layout-export.h"
> > > #include "ivi-layout-private.h"
> > >
> > > +#include "shared/xalloc.h"
> > > +
> > > struct ivi_layout_transition;
> > >
> > > typedef void (*ivi_layout_transition_frame_func)(
> > > @@ -185,12 +187,7 @@ ivi_layout_transition_set_create(struct
> weston_compositor *ec)
> > > 	struct ivi_layout_transition_set *transitions;
> > > 	struct wl_event_loop *loop;
> > >
> > > -	transitions = malloc(sizeof(*transitions));
> > > -	if (transitions == NULL) {
> > > -		weston_log("%s: memory allocation fails\n", __func__);
> > > -		return NULL;
> > > -	}
> > > -
> > > +	transitions = xzalloc(sizeof *transitions);
> >
> > Same per my comment above. Although, in this case, the
> > ivi_layout_transition_set_create call in ivi_layout_init_with_compositor
> > doesn't check for a NULL return anyway (!).
> 
> Heh, so exchanging a crash to an exit. I'm fine with that in this case.
> 
> > And, same for the remaining occurrences in this patch.
> 
> Right.
> 
> I would have let this patch pass otherwise, except there are actually
> quite a lot of these occurrences. The deal breaker is the following:
> 
> > > diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c
> > > index 646eb05..48bec9d 100644
> > > --- a/ivi-shell/ivi-layout.c
> > > +++ b/ivi-shell/ivi-layout.c
> 
> > > @@ -1112,12 +1104,7 @@ ivi_layout_get_screens_under_layer(struct
> ivi_layout_layer *ivilayer,
> > >
> > > 	if (length != 0) {
> > > 		/* the Array must be free by module which called this
> function */
> > > -		*ppArray = calloc(length, sizeof(struct weston_output *));
> > > -		if (*ppArray == NULL) {
> > > -			weston_log("fails to allocate memory\n");
> > > -			return IVI_FAILED;
> > > -		}
> > > -
> > > +		*ppArray = xzalloc(sizeof(struct weston_output *) * length);
> 
> This is where I would not use xzalloc(), but calloc() is actually the
> right one. Calloc will check for multiplication overflows, this here
> does not.
> 
> It's probably not meaningful in this particular patch, but it's a habit
> well learnt, so that's why I don't like this change.
> 
> There are many occurrences of this.
> 
> 
> Thanks,
> pq


More information about the wayland-devel mailing list