[PATCH 1/3] nouveau: cleanup error handling during nouveau_device_wrap
Ilia Mirkin
imirkin at alum.mit.edu
Wed Mar 12 17:45:34 PDT 2014
On Wed, Mar 12, 2014 at 4:45 PM, Emil Velikov <emil.l.velikov at gmail.com> wrote:
> In theory it's possible for any of the nouveau_getparam calls to
> fail whist the last one being successful.
>
> Thus at least one of the following (hard requirements) drmVersion,
> chipset and vram/gart memory size will be filled with garbage and
> sent to the userspace drivers.
What was wrong with the old logic again? Except annoying indentation?
ret = nouveau_getparam(dev, NOUVEAU_GETPARAM_CHIPSET_ID, &chipset);
if (ret == 0)
ret = nouveau_getparam(dev, NOUVEAU_GETPARAM_FB_SIZE, &vram);
if (ret == 0)
ret = nouveau_getparam(dev, NOUVEAU_GETPARAM_AGP_SIZE, &gart);
if (ret) {
nouveau_device_del(&dev);
return ret;
}
It will only run each successive getparam if the previous one succeeded...
>
> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
> ---
> nouveau/nouveau.c | 30 +++++++++++++++++++-----------
> 1 file changed, 19 insertions(+), 11 deletions(-)
>
> diff --git a/nouveau/nouveau.c b/nouveau/nouveau.c
> index ee7893b..d6013db 100644
> --- a/nouveau/nouveau.c
> +++ b/nouveau/nouveau.c
> @@ -88,27 +88,32 @@ nouveau_device_wrap(int fd, int close, struct nouveau_device **pdev)
> nvdev->base.fd = fd;
>
> ver = drmGetVersion(fd);
> - if (ver) dev->drm_version = (ver->version_major << 24) |
> - (ver->version_minor << 8) |
> - ver->version_patchlevel;
> + if (!ver) {
> + ret = -errno;
> + goto error;
> + }
> +
> + dev->drm_version = (ver->version_major << 24) |
> + (ver->version_minor << 8) |
> + ver->version_patchlevel;
> drmFreeVersion(ver);
>
> if ( dev->drm_version != 0x00000010 &&
> (dev->drm_version < 0x01000000 ||
> dev->drm_version >= 0x02000000)) {
> - nouveau_device_del(&dev);
> - return -EINVAL;
> + ret = -EINVAL;
> + goto error;
> }
>
> ret = nouveau_getparam(dev, NOUVEAU_GETPARAM_CHIPSET_ID, &chipset);
> - if (ret == 0)
> + if (ret)
> + goto error;
> ret = nouveau_getparam(dev, NOUVEAU_GETPARAM_FB_SIZE, &vram);
> - if (ret == 0)
> + if (ret)
> + goto error;
> ret = nouveau_getparam(dev, NOUVEAU_GETPARAM_AGP_SIZE, &gart);
> - if (ret) {
> - nouveau_device_del(&dev);
> - return ret;
> - }
> + if (ret)
> + goto error;
>
> ret = nouveau_getparam(dev, NOUVEAU_GETPARAM_HAS_BO_USAGE, &bousage);
> if (ret == 0)
> @@ -139,6 +144,9 @@ nouveau_device_wrap(int fd, int close, struct nouveau_device **pdev)
>
> *pdev = &nvdev->base;
> return 0;
> +error:
> + nouveau_device_del(&dev);
> + return -ret;
you mean 'ret' of course.
> }
>
> int
> --
> 1.9.0
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
More information about the dri-devel
mailing list