On Mon, Sep 08, 2025 at 11:19:33AM -0700, Lizhi Hou wrote: > > On 9/7/25 23:40, Dan Carpenter wrote: > > Hello Lizhi Hou, > > > > Commit 2f509fe6a42c ("accel/amdxdna: Add ioctl > > DRM_IOCTL_AMDXDNA_GET_ARRAY") from Sep 2, 2025 (linux-next), leads to > > the following (UNPUBLISHED) Smatch static checker warning: > > > > drivers/accel/amdxdna/aie2_pci.c:904 aie2_query_ctx_status_array() > > warn: potential user controlled sizeof overflow > > 'args->num_element * args->element_size' '1-u32max(user) * > > 1-u32max(user)' > > > > drivers/accel/amdxdna/aie2_pci.c > > 891 static int aie2_query_ctx_status_array(struct amdxdna_client > > *client, > > 892 struct > > amdxdna_drm_get_array *args) > > 893 { > > 894 struct amdxdna_drm_get_array array_args; > > 895 struct amdxdna_dev *xdna = client->xdna; > > 896 struct amdxdna_client *tmp_client; > > 897 int ret; > > 898 > > 899 drm_WARN_ON(&xdna->ddev, > > !mutex_is_locked(&xdna->dev_lock)); > > 900 > > 901 array_args.element_size = min(args->element_size, > > 902 sizeof(struct > > amdxdna_drm_hwctx_entry)); > > > > Instead of min() here we should just return -EINVAL if they are !=. > > The request element_size from runtime tools can be smaller or bigger than > sizeof(struct amdxdna_drm_hwctx_entry). > > If element_size is smaller, element_size bytes will be copied to user space. > > If it is bigger, sizeof(struct amdxdna_drm_hwctx_entry) bytes will be > copied. > > And the actual element size and number of element will be returned to > userspace. >
This is a new API. We should be strict about what kind of inputs we allow so that if we want to in the future we can change it without breaking things. Supplying a larger value is not useful at all. We should return -EINVAL for that. I'm guessing userspace already takes advantage of passing a smaller value but it's not documented why this is required. My guess is that maybe at times at times we just want the ->context_id or something? Maybe the first three members of the struct? > > > > > > 903 array_args.buffer = args->buffer; > > --> 904 array_args.num_element = args->num_element * > > args->element_size / > > > > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > These are both u32 values controlled by the user so this is an integer > > overflow bug. Security bug. > > This will not cause an issue. array_args.num_element is considered as user > control as well. That's true. > > If it is too big, the actual number of active hwctx will be returned. > > It is better to put a reasonable limitation. I would add a check > (args->num_element < 1K && args->element_size < 4K). Will this fix the > smatch warning? > Yes. Anything which prevents an integer oveflow is sufficient. Thanks! regards, dan carpenter