[PATCH 1/2] randr: Make deletion of output properties more robust

Jamey Sharp jamey at minilop.net
Sun Jun 6 06:52:33 PDT 2010


This is a little strange. Apparently RRDeleteAllOutputProperties was
not freeing prop->valid_values. Was there perhaps a reason for that,
or is that just yet another bug fixed by this patch?

Jamey

On Sun, Jun 6, 2010 at 6:40 AM, Mikhail Gusarov <dottedmag at dottedmag.net> wrote:
> Previously there was two branches of code with small discrepancies between
> them. Extract the common routine and fix double-free prop->valid_values by the
> way.
>
> Signed-off-by: Mikhail Gusarov <dottedmag at dottedmag.net>
> ---
>  randr/rrproperty.c |   76 ++++++++++++++++++++++++----------------------------
>  1 files changed, 35 insertions(+), 41 deletions(-)
>
> diff --git a/randr/rrproperty.c b/randr/rrproperty.c
> index a4402e1..7b8e44e 100644
> --- a/randr/rrproperty.c
> +++ b/randr/rrproperty.c
> @@ -53,25 +53,39 @@ static void RRDeliverPropertyEvent(ScreenPtr pScreen, xEvent *event)
>        WalkTree(pScreen, DeliverPropertyEvent, event);
>  }
>
> +static void
> +RRDestroyOutputProperty (RRPropertyPtr prop)
> +{
> +    free(prop->valid_values);
> +    free(prop->current.data);
> +    free(prop->pending.data);
> +    free(prop);
> +}
> +
> +static void
> +RRDeleteProperty(RROutputRec *output, RRPropertyRec *prop)
> +{
> +    xRROutputPropertyNotifyEvent event;
> +    event.type = RREventBase + RRNotify;
> +    event.subCode = RRNotify_OutputProperty;
> +    event.output = output->id;
> +    event.state = PropertyDelete;
> +    event.atom = prop->propertyName;
> +    event.timestamp = currentTime.milliseconds;
> +
> +    RRDeliverPropertyEvent(output->pScreen, (xEvent *)&event);
> +
> +    RRDestroyOutputProperty(prop);
> +}
> +
>  void
> -RRDeleteAllOutputProperties (RROutputPtr output)
> +RRDeleteAllOutputProperties(RROutputPtr output)
>  {
>     RRPropertyPtr prop, next;
> -    xRROutputPropertyNotifyEvent    event;
>
> -    for (prop = output->properties; prop; prop = next)
> -    {
> +    for (prop = output->properties; prop; prop = next) {
>        next = prop->next;
> -       event.type = RREventBase + RRNotify;
> -       event.subCode = RRNotify_OutputProperty;
> -       event.output = output->id;
> -       event.state = PropertyDelete;
> -       event.atom = prop->propertyName;
> -       event.timestamp = currentTime.milliseconds;
> -       RRDeliverPropertyEvent (output->pScreen, (xEvent *)&event);
> -       free(prop->current.data);
> -       free(prop->pending.data);
> -       free(prop);
> +        RRDeleteProperty(output, prop);
>     }
>  }
>
> @@ -104,37 +118,17 @@ RRCreateOutputProperty (Atom property)
>     return prop;
>  }
>
> -static void
> -RRDestroyOutputProperty (RRPropertyPtr prop)
> -{
> -    free(prop->valid_values);
> -    free(prop->current.data);
> -    free(prop->pending.data);
> -    free(prop->valid_values);
> -    free(prop);
> -}
> -
>  void
> -RRDeleteOutputProperty (RROutputPtr output, Atom property)
> +RRDeleteOutputProperty(RROutputPtr output, Atom property)
>  {
> -    RRPropertyPtr      prop, *prev;
> -    xRROutputPropertyNotifyEvent    event;
> +    RRPropertyRec *prop, *prev;
>
>     for (prev = &output->properties; (prop = *prev); prev = &(prop->next))
> -       if (prop->propertyName == property)
> -           break;
> -    if (prop)
> -    {
> -       *prev = prop->next;
> -       event.type = RREventBase + RRNotify;
> -       event.subCode = RRNotify_OutputProperty;
> -       event.output = output->id;
> -       event.state = PropertyDelete;
> -       event.atom = prop->propertyName;
> -       event.timestamp = currentTime.milliseconds;
> -       RRDeliverPropertyEvent (output->pScreen, (xEvent *)&event);
> -       RRDestroyOutputProperty (prop);
> -    }
> +       if (prop->propertyName == property) {
> +            *prev = prop->next;
> +            RRDeleteProperty(prop);
> +            return;
> +        }
>  }
>
>  int
> --
> 1.7.1
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>


More information about the xorg-devel mailing list