OSDN Git Service

drm/amd/amdgpu: Fix debugfs error handling
authorDan Carpenter <dan.carpenter@oracle.com>
Thu, 14 Jun 2018 14:45:23 +0000 (17:45 +0300)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 16 Oct 2018 20:10:34 +0000 (15:10 -0500)
The error handling is wrong and "ent" could be NULL we when dereference
it to get "ent->d_inode".

The thing is that normally debugfs_create_file() is not supposed to
require (or have) any error handling.  That function does return error
pointers if debugfs is turned off but we know it's enable here.  When
it's enabled, then it returns NULL on error.

So what I did was I stripped out all the error handling except around
the i_size_write().  I could have just used a NULL check instead of an
IS_ERR_OR_NULL() but I figured this was more clear because that way you
don't have to look at the surrounding code to see whether debugfs is
enabled or not.

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c

index f5fb937..dd9a4fb 100644 (file)
@@ -826,21 +826,13 @@ int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
 {
        struct drm_minor *minor = adev->ddev->primary;
        struct dentry *ent, *root = minor->debugfs_root;
-       unsigned i, j;
+       unsigned int i;
 
        for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
                ent = debugfs_create_file(debugfs_regs_names[i],
                                          S_IFREG | S_IRUGO, root,
                                          adev, debugfs_regs[i]);
-               if (IS_ERR(ent)) {
-                       for (j = 0; j < i; j++) {
-                               debugfs_remove(adev->debugfs_regs[i]);
-                               adev->debugfs_regs[i] = NULL;
-                       }
-                       return PTR_ERR(ent);
-               }
-
-               if (!i)
+               if (!i && !IS_ERR_OR_NULL(ent))
                        i_size_write(ent->d_inode, adev->rmmio_size);
                adev->debugfs_regs[i] = ent;
        }