<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 21, 2016 at 9:37 AM, Miguel A. Vico <span dir="ltr"><<a href="mailto:mvicomoya@nvidia.com" target="_blank">mvicomoya@nvidia.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Using strstr(3) for checking for extensions is an error-prone mechanism<br>
as extension names can be prefixes of other extension names (see<br>
<a href="https://www.opengl.org/registry/doc/rules.html#using" rel="noreferrer" target="_blank">https://www.opengl.org/registry/doc/rules.html#using</a>).<br>
<br>
This change implements the check_extension() function to properly check<br>
for an extension and replaces all usages of strstr(3).<br>
<br>
Signed-off-by: Miguel A Vico Moya <<a href="mailto:mvicomoya@nvidia.com" target="_blank">mvicomoya@nvidia.com</a>><br>
Reviewed-by: Andy Ritger <<a href="mailto:aritger@nvidia.com" target="_blank">aritger@nvidia.com</a>><br>
---<br>
 src/gl-renderer.c | 56 +++++++++++++++++++++++++++++++++++++++++--------------<br>
 1 file changed, 42 insertions(+), 14 deletions(-)<br>
<br>
diff --git a/src/gl-renderer.c b/src/gl-renderer.c<br>
index 1d6d98c..3ca1aed 100644<br>
--- a/src/gl-renderer.c<br>
+++ b/src/gl-renderer.c<br>
@@ -2701,6 +2701,34 @@ gl_renderer_destroy(struct weston_compositor *ec)<br>
        free(gr);<br>
 }<br>
<br>
+static<br>
+bool check_extension(const char *extensions, const char *extension)<br>
+{<br>
+       size_t extlen = strlen(extension);<br>
+       const char *end = extensions + strlen(extensions);<br>
+<br>
+       while (extensions < end) {<br>
+               size_t n = 0;<br>
+<br>
+               /* Skip whitespaces, if any */<br>
+               if (*extensions == ' ') {<br>
+                       extensions++;<br>
+                       continue;<br>
+               }<br>
+<br>
+               n = strcspn(extensions, " ");<br>
+<br>
+               /* Compare strings */<br>
+               if (n == extlen && strncmp(extension, extensions, n) == 0)<br>
+                       return true; /* Found */<br>
+<br>
+               extensions += n;<br>
+       }<br>
+<br>
+       /* Not found */<br>
+       return false;<br>
+}<br>
+<br></blockquote><div><br></div><div>Slightly faster version that avoids some temporaries and strlen calls:</div><div><br></div><div><div>static</div><div>bool check_extension(const char *extensions, const char *extension)</div><div>{</div><div><span class="" style="white-space:pre">     </span>while (*extensions) {</div><div><span class="" style="white-space:pre">              </span>size_t n = strcspn(extensions, " ");</div><div><br></div><div><span class="" style="white-space:pre">            </span>/* Skip whitespaces, if any */</div><div><span class="" style="white-space:pre">             </span>if (n < 1) {</div><div><span class="" style="white-space:pre">                    </span>extensions++;</div><div><span class="" style="white-space:pre">                      </span>continue;</div><div><span class="" style="white-space:pre">          </span>}</div><div><br></div><div><span class="" style="white-space:pre">         </span>/* Compare strings */</div><div><span class="" style="white-space:pre">              </span>if (strncmp(extension, extensions, n) == 0 && !extension[n])</div><div><span class="" style="white-space:pre">                       </span>return true; /* Found */</div><div><br></div><div><span class="" style="white-space:pre">          </span>extensions += n;</div><div><span class="" style="white-space:pre">   </span>}</div><div><br></div><div><span class="" style="white-space:pre"> </span>/* Not found */</div><div><span class="" style="white-space:pre">    </span>return false;</div><div>}</div></div><div><br></div></div></div></div>