[Mesa-dev] [PATCH] gallium/hud: prevent NULL pointer dereference with pipe_query functions
Marek Olšák
maraeo at gmail.com
Thu Jun 25 05:36:57 PDT 2015
What's the point of drawing a HUD pane if a query cannot be created?
Can we detect this during initialization?
Marek
On Wed, Jun 24, 2015 at 9:26 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> The HUD doesn't check if query_create() fails and it calls other
> pipe_query functions with NULL pointer instead of a valid query object.
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
> src/gallium/auxiliary/hud/hud_driver_query.c | 14 ++++++++------
> 1 file changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/src/gallium/auxiliary/hud/hud_driver_query.c b/src/gallium/auxiliary/hud/hud_driver_query.c
> index 603aba7..ee71678 100644
> --- a/src/gallium/auxiliary/hud/hud_driver_query.c
> +++ b/src/gallium/auxiliary/hud/hud_driver_query.c
> @@ -62,7 +62,8 @@ query_new_value(struct hud_graph *gr)
> uint64_t now = os_time_get();
>
> if (info->last_time) {
> - pipe->end_query(pipe, info->query[info->head]);
> + if (info->query[info->head])
> + pipe->end_query(pipe, info->query[info->head]);
>
> /* read query results */
> while (1) {
> @@ -70,7 +71,7 @@ query_new_value(struct hud_graph *gr)
> union pipe_query_result result;
> uint64_t *res64 = (uint64_t *)&result;
>
> - if (pipe->get_query_result(pipe, query, FALSE, &result)) {
> + if (query && pipe->get_query_result(pipe, query, FALSE, &result)) {
> info->results_cumulative += res64[info->result_index];
> info->num_results++;
>
> @@ -88,7 +89,8 @@ query_new_value(struct hud_graph *gr)
> "gallium_hud: all queries are busy after %i frames, "
> "can't add another query\n",
> NUM_QUERIES);
> - pipe->destroy_query(pipe, info->query[info->head]);
> + if (info->query[info->head])
> + pipe->destroy_query(pipe, info->query[info->head]);
> info->query[info->head] =
> pipe->create_query(pipe, info->query_type, 0);
> }
> @@ -113,15 +115,15 @@ query_new_value(struct hud_graph *gr)
> info->results_cumulative = 0;
> info->num_results = 0;
> }
> -
> - pipe->begin_query(pipe, info->query[info->head]);
> }
> else {
> /* initialize */
> info->last_time = now;
> info->query[info->head] = pipe->create_query(pipe, info->query_type, 0);
> - pipe->begin_query(pipe, info->query[info->head]);
> }
> +
> + if (info->query[info->head])
> + pipe->begin_query(pipe, info->query[info->head]);
> }
>
> static void
> --
> 2.4.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list