From: Emil Velikov <emil.veli...@collabora.com> Cut down the unnecessary malloc/memcpy/free by utilising the explicit copy provided by the client.
But above all: do so, after ensuring we get valid data from the implementation. Fixes: cef12efc15c ("glamor: Implement GetSupportedModifiers") Cc: Louis-Francis Ratté-Boulianne <l...@collabora.com> Cc: Daniel Stone <dani...@collabora.com> Signed-off-by: Emil Velikov <emil.veli...@collabora.com> --- dri3/dri3_screen.c | 50 +++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/dri3/dri3_screen.c b/dri3/dri3_screen.c index ec9afe28a..f5ca07934 100644 --- a/dri3/dri3_screen.c +++ b/dri3/dri3_screen.c @@ -117,8 +117,10 @@ cache_formats_and_modifiers(ScreenPtr screen) { dri3_screen_priv_ptr ds = dri3_screen_priv(screen); const dri3_screen_info_rec *info = ds->info; - CARD32 *formats = NULL; - CARD64 *modifiers = NULL; + CARD32 num_formats; + CARD32 *formats; + CARD32 num_modifiers; + CARD64 *modifiers; int i; if (ds->formats_cached) @@ -127,34 +129,36 @@ cache_formats_and_modifiers(ScreenPtr screen) if (!info || !info->get_formats || !info->get_modifiers) return BadImplementation; - (*info->get_formats) (screen, &ds->num_formats, &formats); - ds->formats = calloc(ds->num_formats, sizeof(dri3_dmabuf_format_rec)); + if (!info->get_formats(screen, &num_formats, &formats)) + return BadAlloc; + + if (!num_formats) { + ds->num_formats = 0; + ds->formats_cached = TRUE; + return Success; + } + + ds->formats = calloc(num_formats, sizeof(dri3_dmabuf_format_rec)); if (!ds->formats) return BadAlloc; - for (i = 0; i < ds->num_formats; i++) { + for (i = 0; i < num_formats; i++) { dri3_dmabuf_format_ptr iter = &ds->formats[i]; + if (!info->get_modifiers(screen, formats[i], + &num_modifiers, + &modifiers)) + continue; + + if (!num_modifiers) + continue; + iter->format = formats[i]; - (*info->get_modifiers) (screen, formats[i], - &iter->num_modifiers, - &modifiers); - - iter->modifiers = malloc(iter->num_modifiers * sizeof(CARD64)); - if (iter->modifiers == NULL) - goto error; - - memcpy(iter->modifiers, modifiers, - iter->num_modifiers * sizeof(CARD64)); - goto done; - -error: - iter->num_modifiers = 0; - free(iter->modifiers); -done: - free(modifiers); + iter->num_modifiers = num_modifiers; + iter->modifiers = modifiers; } - free(formats); + + ds->num_formats = i; ds->formats_cached = TRUE; return Success; -- 2.16.0 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel