On March 1, 2018 1:31:53 PM UTC, Thierry Reding <thierry.red...@gmail.com> 
wrote:
> From: Thierry Reding <tred...@nvidia.com>
> 
> ARM SoCs usually have their DRM/KMS devices on the platform bus, so
> add
> support for this bus in order to allow use of the DRI_PRIME
> environment
> variable with those devices.
> 
> While at it, also support the host1x bus, which is effectively the
> same
> but uses an additional layer in the bus hierarchy.
> 
> Note that it isn't enough to support the bus that has the rendering
> GPU
> because the loader code will also try to construct an ID path tag for
> a
> scanout-only device if it is the default that is being opened.
> 
> The ID path tag for a device can be obtained by running udevadm info
> on
> the device node:
> 
>       $ udevadm info /dev/dri/card0
> 
> and looking up the ID_PATH_TAG entry in the output.
> 
> Signed-off-by: Thierry Reding <tred...@nvidia.com>
> ---
>  src/loader/loader.c | 27 +++++++++++++++++++++++++++
>  1 file changed, 27 insertions(+)
> 
> diff --git a/src/loader/loader.c b/src/loader/loader.c
> index 92b4c5204b19..ca578b8cd232 100644
> --- a/src/loader/loader.c
> +++ b/src/loader/loader.c
> @@ -120,6 +120,33 @@ static char
> *drm_construct_id_path_tag(drmDevicePtr device)
>                     device->businfo.pci->func) < 0) {
>           return NULL;
>        }
> +   } else if (device->bustype == DRM_BUS_PLATFORM ||
> +              device->bustype == DRM_BUS_HOST1X) {
> +      char *fullname, *name, *address;
> +
> +      if (device->bustype == DRM_BUS_PLATFORM)
> +         fullname = device->businfo.platform->fullname;
> +      else
> +         fullname = device->businfo.host1x->fullname;
> +
> +      name = strrchr(fullname, '/');
> +      if (!name)
> +         name = strdup(fullname);
> +      else
> +         name = strdup(++name);

Looks like UB to me; how about this instead?

  name = strdup(name + 1);

With that:
Reviewed-by: Eric Engestrom <e...@engestrom.ch>

> +
> +      address = strchr(name, '@');
> +      if (address) {
> +         *address++ = '\0';
> +
> +         if (asprintf(&tag, "platform-%s_%s", address, name) < 0)
> +            tag = NULL;
> +      } else {
> +         if (asprintf(&tag, "platform-%s", name) < 0)
> +            tag = NULL;
> +      }
> +
> +      free(name);
>     }
>     return tag;
>  }
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to