[Piglit] [PATCH] egl-1.4: Add test egl-terminate-then-unbind-context

Paul Berry stereotype441 at gmail.com
Fri Oct 4 13:42:45 PDT 2013


On 20 September 2013 12:38, Chad Versace <chad.versace at linux.intel.com>wrote:

> This test makes current a context, terminates the context's display, then
> unbinds the context. According to the EGL 1.4 spec (2011.04.06), Section
> 3.2 Initialization, no errors should occur.
>
> Exposes a use-after-free crash on mesa-9.2 with i965. This is the
> underlying reason that `./$gles1_test -fbo` crashes on Intel for each
> GLES1 test.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=69622
> CC: Ian Romanick <idr at freedesktop.org>
> CC: Paul Berry <stereotype441 at gmail.com>
> Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
> ---
>  tests/all.tests                                    |   1 +
>  tests/egl/spec/CMakeLists.txt                      |   1 +
>  tests/egl/spec/egl-1.4/CMakeLists.gles2.txt        |   8 ++
>  tests/egl/spec/egl-1.4/CMakeLists.txt              |   1 +
>  .../egl-1.4/egl-terminate-then-unbind-context.c    | 108
> +++++++++++++++++++++
>  5 files changed, 119 insertions(+)
>  create mode 100644 tests/egl/spec/egl-1.4/CMakeLists.gles2.txt
>  create mode 100644 tests/egl/spec/egl-1.4/CMakeLists.txt
>  create mode 100644
> tests/egl/spec/egl-1.4/egl-terminate-then-unbind-context.c
>
> diff --git a/tests/all.tests b/tests/all.tests
> index a7bf00c..6a89287 100644
> --- a/tests/all.tests
> +++ b/tests/all.tests
> @@ -3020,6 +3020,7 @@ egl14['eglQuerySurface EGL_BAD_ATTRIBUTE'] =
> plain_test('egl-query-surface --bad
>  egl14['eglQuerySurface EGL_BAD_SURFACE'] = plain_test('egl-query-surface
> --bad-surface')
>  egl14['eglQuerySurface EGL_HEIGHT'] = plain_test('egl-query-surface
> --attr=EGL_HEIGHT')
>  egl14['eglQuerySurface EGL_WIDTH'] = plain_test('egl-query-surface
> --attr=EGL_WIDTH')
> +egl14['eglTerminate then unbind context'] =
> plain_test('egl-terminate-then-unbind-context')
>
>  egl_nok_swap_region = Group()
>  spec['EGL_NOK_swap_region'] = egl_nok_swap_region
> diff --git a/tests/egl/spec/CMakeLists.txt b/tests/egl/spec/CMakeLists.txt
> index de4de3f..12bb419 100644
> --- a/tests/egl/spec/CMakeLists.txt
> +++ b/tests/egl/spec/CMakeLists.txt
> @@ -1 +1,2 @@
> +add_subdirectory (egl-1.4)
>  add_subdirectory (egl_khr_create_context)
> diff --git a/tests/egl/spec/egl-1.4/CMakeLists.gles2.txt
> b/tests/egl/spec/egl-1.4/CMakeLists.gles2.txt
> new file mode 100644
> index 0000000..b6bb1e8
> --- /dev/null
> +++ b/tests/egl/spec/egl-1.4/CMakeLists.gles2.txt
> @@ -0,0 +1,8 @@
> +link_libraries(
> +       piglitutil_${piglit_target_api}
> +        ${OPENGL_egl_LIBRARY}
> +        )
> +
> +piglit_add_executable(egl-terminate-then-unbind-context
> egl-terminate-then-unbind-context.c)
> +
> +# vim: ft=cmake:
> diff --git a/tests/egl/spec/egl-1.4/CMakeLists.txt
> b/tests/egl/spec/egl-1.4/CMakeLists.txt
> new file mode 100644
> index 0000000..144a306
> --- /dev/null
> +++ b/tests/egl/spec/egl-1.4/CMakeLists.txt
> @@ -0,0 +1 @@
> +piglit_include_target_api()
> diff --git a/tests/egl/spec/egl-1.4/egl-terminate-then-unbind-context.c
> b/tests/egl/spec/egl-1.4/egl-terminate-then-unbind-context.c
> new file mode 100644
> index 0000000..acf3dcb
> --- /dev/null
> +++ b/tests/egl/spec/egl-1.4/egl-terminate-then-unbind-context.c
> @@ -0,0 +1,108 @@
> +/* Copyright © 2013 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the
> "Software"),
> + * to deal in the Software without restriction, including without
> limitation
> + * the rights to use, copy, modify, merge, publish, distribute,
> sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the
> next
> + * paragraph) shall be included in all copies or substantial portions of
> the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT
> SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
> OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> DEALINGS
> + * IN THE SOFTWARE.
> + */
> +
> +/**
> + * \file
> + *
> + * This test makes current a context, terminates the context's display,
> then
> + * unbinds the context. According to the EGL 1.4 spec (2011.04.06),
> Section
> + * 3.2 Initialization, no error should occur.
> + *
> + *     EGLBoolean eglTerminate(EGLDisplay dpy);
> + *
> + *     Termination marks all EGL-specific resources, such as contexts and
> + *     surfaces, associated with the specified display for deletion.
> Handles
> + *     to all such resources are invalid as soon as eglTerminate returns,
> but
> + *     the dpy handle itself remains valid. [...] Applications should not
> try
> + *     to perform useful work with such resources following eglTerminate;
> only
> + *     eglMakeCurrent or eglReleaseThread should be called, to complete
> + *     deletion of these resources.
> + *
> + *     If contexts or surfaces created with respect to dpy are current
> (see
> + *     section 3.7.3) to any thread, then they are not actually destroyed
> + *     while they remain current. Such contexts and surfaces will be
> destroyed
> + *     as soon as eglReleaseThread is called from the thread they are
> bound
> + *     to, or eglMakeCurrent is called from that thread with the current
> + *     rendering API (see section 3.7) set such that the current context
> is
> + *     affected. [...]
> + */
> +
> +#include <stdbool.h>
> +#include <stdio.h>
> +
> +#include "piglit-util-egl.h"
> +
> +#define fail(msg) \
> +       do { \
> +               fprintf(stderr, "error: %s:%d: %s failed\n", __func__,
> __LINE__, msg); \
> +               piglit_report_result(PIGLIT_FAIL); \
> +       } while (0)
> +
> +int
> +main(int argc, char **argv)
> +{
> +       EGLDisplay dpy;
> +       EGLint major_version;
> +       EGLint minor_version;
> +       EGLConfig config;
> +       EGLint num_configs = 0;
> +       EGLContext ctx;
> +       bool ok;
> +
> +       dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY );
> +       if (!dpy)
> +               fail("eglGetDisplay(EGL_DEFAULT_DISPLAY) failed");
> +
> +       ok = eglInitialize(dpy, &major_version, &minor_version);
> +       if (!ok)
> +               fail("eglInitialize() failed");
> +
> +       if (!piglit_is_egl_extension_supported(dpy,
> "EGL_KHR_surfaceless_context"))
> +               piglit_report_result(PIGLIT_SKIP);
>

It's not obvious clear why EGL_KHR_surfaceless_context is necessary for
this test.  Can we remove this check, or add a comment explaining why it's
necessary?

With that addressed, this patch is:

Reviewed-by: Paul Berry <stereotype441 at gmail.com>


> +
> +       ok = eglChooseConfig(dpy, NULL, &config, 1, &num_configs);
> +       if (!ok)
> +               fail("eglChooseConfig() failed");
> +       if (num_configs == 0)
> +               fail("eglChooseConfig() returned no configs\n");
> +
> +       ctx = eglCreateContext(dpy, config, EGL_NO_CONTEXT, NULL );
> +       if (!ctx)
> +               fail("eglCreateContext() failed");
> +
> +       ok = eglMakeCurrent(dpy, NULL, NULL, ctx);
> +       if (!ok)
> +               fail("eglMakeCurrent()");
> +
> +       ok = eglTerminate(dpy);
> +       if (!ok)
> +          fail("eglTerminate()");
> +
> +       /* Unbind the context. */
> +       ok = eglMakeCurrent(dpy, NULL, NULL, NULL);
> +       if (!ok)
> +               fail("eglMakeCurrent(ctx=NULL)");
> +
> +       piglit_report_result(PIGLIT_PASS);
> +       return 0;
> +
> +}
> --
> 1.8.3.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20131004/6fc03644/attachment-0001.html>


More information about the Piglit mailing list