[Mesa-dev] [RFC PATCH] dri megadriver_stub: provide compatibility with older DRI loader

Keith Packard keithp at keithp.com
Fri Dec 6 15:01:27 PST 2013


Jordan Justen <jljusten at gmail.com> writes:

>> We find the driver foo's name by using the dladdr function
>> which gives the path of the dynamic library's name that
>> was being loaded.

That sounds like all kinds of win for existing X servers. Thanks for
doing it up in style, so that a megadrivers build can actually work for
all chips in the megadriver.

(as a style issue, I probably would have computed the driver name from
the dli_fname value directly and then copied it out into new storage, or
directly into get_extensions_name, but that's just me, so you should
feel free to ignore it :-)

>> +   /* Make sure the patch ends with _dri.so */
>> +   name_len = strlen(driver_name);
>> +   if (strcmp(driver_name + (name_len - 7), "_dri.so") != 0) {

Need to make sure name_len is >= 7 here. Should probably just have a
test that checks namelen and bails if it's < 7 as there are other places
using this magic value.

(Oh, I'd probably stick "_dri.so" in a #define and then #define the
length of it too, instead of using '7' in several places. Again, style,
not substance, so you can ignore that as you please.)

>> +   i = asprintf(&get_extensions_name, "%s_%s",
>> +                __DRI_DRIVER_GET_EXTENSIONS, driver_name);
>> +   free(driver_path);
>> +   if (i == -1 || !get_extensions_name)
>> +      return;

Is the null pointer check here useful or necessary? asprintf doesn't
define the value when allocation fails, preferring to return -1
instead. Are there systems which return valid 'i' and null pointer?

>> +   /* Copy the extensions into the __driDriverExtensions array
>> +    * we declared.
>> +    */
>> +   for (i = 0; i < ARRAY_SIZE(__driDriverExtensions); i++) {
>> +      __driDriverExtensions[i] = extensions[i];
>> +      if (extensions[i] == NULL)
>> +         break;
>> +   }
>> +
>> +   /* If the driver had more extensions that we reserved, then
>> +    * bail out. This will cause the driver to fail to load using
>> +    * the older loader mechanism.
>> +    */
>> +   if (extensions[i] != NULL) {

This check is incorrect -- you will dereference off the end of the array
when you fill it. Instead, you should just check for

        if (i == ARRAY_SIZE(__driDriverExtensions))

as that will let you know the array was filled

-- 
keith.packard at intel.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 827 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20131206/393f249d/attachment-0001.pgp>


More information about the mesa-dev mailing list