[Mesa-dev] [PATCH shader-db 3/3] run: add extension_in_string() helper

Emil Velikov emil.l.velikov at gmail.com
Wed Sep 13 21:44:07 UTC 2017


On 13 September 2017 at 22:13, Matt Turner <mattst88 at gmail.com> wrote:
> On Mon, Aug 21, 2017 at 3:27 AM, Emil Velikov <emil.l.velikov at gmail.com> wrote:
>> From: Emil Velikov <emil.velikov at collabora.com>
>>
>> memmem() does not attribute what the character after the searched string
>> is. Thus it will flag even when haystack is "foobar" while we're looking
>> for "foo".
>>
>> Pull a small helper (based on piglit) that correctly handles this and use
>> it.
>>
>> Note: when parsing through the shader we have a non-zero terminated
>> needle, let's keep the memmem in there for now.
>>
>> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
>> ---
>>  run.c | 43 +++++++++++++++++++++++++++++++++++--------
>>  1 file changed, 35 insertions(+), 8 deletions(-)
>>
>> diff --git a/run.c b/run.c
>> index d0d4598..0691d33 100644
>> --- a/run.c
>> +++ b/run.c
>> @@ -69,6 +69,35 @@ struct shader {
>>      int type;
>>  };
>>
>> +static bool
>> +extension_in_string(const char *haystack, const char *needle)
>> +{
>> +    const unsigned needle_len = strlen(needle);
>> +
>> +    if (needle_len == 0)
>> +        return false;
>> +
>> +    while (true) {
>> +        const char *const s = strstr(haystack, needle);
>> +
>> +        if (s == NULL)
>> +            return false;
>> +
>> +        if (s[needle_len] == ' ' || s[needle_len] == '\0')
>> +            return true;
>> +
>> +        /* strstr found an extension whose name begins with
>> +         * needle, but whose name is not equal to needle.
>> +         * Restart the search at s + needle_len so that we
>> +         * don't just find the same extension again and go
>> +         * into an infinite loop.
>> +         */
>> +        haystack = s + needle_len;
>> +    }
>> +
>> +    return false;
>> +}
>> +
>>  static struct shader *
>>  get_shaders(const struct context_info *core, const struct context_info *compat,
>>              const char *text, size_t text_size,
>> @@ -141,8 +170,8 @@ get_shaders(const struct context_info *core, const struct context_info *compat,
>>          extension_text += 1;
>>          const char *newline = memchr(extension_text, '\n',
>>                                       end_text - extension_text);
>> -        if (memmem(info->extension_string, info->extension_string_len,
>> -                   extension_text, newline - extension_text) == NULL) {
>> +        if (memmem(info->extension_string, info->extension_string_len,
>> +                   extension_text, newline - extension_text) == NULL) {
>>              fprintf(stderr, "SKIP: %s requires unavailable extension %.*s\n",
>>                      shader_name, (int)(newline - extension_text), extension_text);
>>              return NULL;
>> @@ -415,7 +444,7 @@ main(int argc, char **argv)
>>          return -1;
>>      }
>>
>> -    if (!strstr(client_extensions, "EGL_MESA_platform_gbm")) {
>> +    if (!extension_in_string(client_extensions, "EGL_MESA_platform_gbm")) {
>>          fprintf(stderr, "ERROR: Missing EGL_MESA_platform_gbm\n");
>>          return -1;
>>      }
>> @@ -458,7 +487,7 @@ main(int argc, char **argv)
>>      };
>>      for (int i = 0; i < ARRAY_SIZE(egl_extension); i++) {
>>          const char *extension_string = eglQueryString(egl_dpy, EGL_EXTENSIONS);
>> -        if (strstr(extension_string, egl_extension[i]) == NULL) {
>> +        if (!extension_in_string(extension_string, egl_extension[i])) {
>>              fprintf(stderr, "ERROR: Missing %s\n", egl_extension[i]);
>>              ret = -1;
>>              goto egl_terminate;
>> @@ -530,8 +559,7 @@ main(int argc, char **argv)
>>
>>          core.max_glsl_version = get_glsl_version();
>>
>> -        if (memmem(core.extension_string, core.extension_string_len,
>> -                   "GL_KHR_debug", strlen("GL_KHR_debug")) == NULL) {
>> +        if (!extension_in_string(core.extension_string, "GL_KHR_debug")) {
>
> I don't know what happened between this patch and getting committed,
> but what was committed contained a copy-and-paste mistake here (used
> compat.extension_string, which is NULL rather than
> core.extension_string) so run always segfaulted!
>
> I pushed a fix. Kind of irritating that this wasn't fixed in the week
> since it was reported.
Sincere apologies for that one - must have fat fingered while rebasing.

I was staring at it the other day and could spot it.
Even asked Tim for a sample shader.

-Emil (looking for a brown paper bag)


More information about the mesa-dev mailing list