Hello Maarten Lankhorst,

This is a semi-automatic email about new static checker warnings.

The patch cf3e3e86d779: "drm/i915: Use ttm mmap handling for ttm 
bo's." from Jun 10, 2021, leads to the following Smatch complaint:

    ./drivers/gpu/drm/i915/gem/i915_gem_mman.c:1008 i915_gem_mmap()
    error: we previously assumed 'node' could be null (see line 953)

./drivers/gpu/drm/i915/gem/i915_gem_mman.c
   949          drm_vma_offset_lock_lookup(dev->vma_offset_manager);
   950          node = 
drm_vma_offset_exact_lookup_locked(dev->vma_offset_manager,
   951                                                    vma->vm_pgoff,
   952                                                    vma_pages(vma));
   953          if (node && drm_vma_node_is_allowed(node, priv)) {
                    ^^^^
Lots of NULL checking

   954                  /*
   955                   * Skip 0-refcnted objects as it is in the process of 
being
   956                   * destroyed and will be invalid when the vma manager 
lock
   957                   * is released.
   958                   */
   959                  if (!node->driver_private) {
   960                          mmo = container_of(node, struct 
i915_mmap_offset, vma_node);
   961                          obj = i915_gem_object_get_rcu(mmo->obj);
   962  
   963                          GEM_BUG_ON(obj && obj->ops->mmap_ops);
   964                  } else {
   965                          obj = i915_gem_object_get_rcu
   966                                  (container_of(node, struct 
drm_i915_gem_object,
   967                                                base.vma_node));
   968  
   969                          GEM_BUG_ON(obj && !obj->ops->mmap_ops);
   970                  }
   971          }
   972          drm_vma_offset_unlock_lookup(dev->vma_offset_manager);
   973          rcu_read_unlock();
   974          if (!obj)
   975                  return node ? -EACCES : -EINVAL;
                               ^^^^
Checked

   976  
   977          if (i915_gem_object_is_readonly(obj)) {
   978                  if (vma->vm_flags & VM_WRITE) {
   979                          i915_gem_object_put(obj);
   980                          return -EINVAL;
   981                  }
   982                  vm_flags_clear(vma, VM_MAYWRITE);
   983          }
   984  
   985          anon = mmap_singleton(to_i915(dev));
   986          if (IS_ERR(anon)) {
   987                  i915_gem_object_put(obj);
   988                  return PTR_ERR(anon);
   989          }
   990  
   991          vm_flags_set(vma, VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP | 
VM_IO);
   992  
   993          /*
   994           * We keep the ref on mmo->obj, not vm_file, but we require
   995           * vma->vm_file->f_mapping, see vma_link(), for later 
revocation.
   996           * Our userspace is accustomed to having per-file resource 
cleanup
   997           * (i.e. contexts, objects and requests) on their close(fd), 
which
   998           * requires avoiding extraneous references to their filp, hence 
why
   999           * we prefer to use an anonymous file for their mmaps.
  1000           */
  1001          vma_set_file(vma, anon);
  1002          /* Drop the initial creation reference, the vma is now holding 
one. */
  1003          fput(anon);
  1004  
  1005          if (obj->ops->mmap_ops) {
  1006                  vma->vm_page_prot = 
pgprot_decrypted(vm_get_page_prot(vma->vm_flags));
  1007                  vma->vm_ops = obj->ops->mmap_ops;
  1008                  vma->vm_private_data = node->driver_private;
                                               ^^^^^^^^^^^^^^^^^^^^
Patch adds unchecked dereference.

  1009                  return 0;
  1010          }

regards,
dan carpenter

Reply via email to