On Sat, May 02, 2026 at 12:40:10PM +0300, Dan Carpenter wrote:
> I'm not sure exactly who to report this bug too.  Probably the mm
> devs?

[Adding John and TJ, in case they are interested / able to help]

Will

(original report follows)

>       drivers/dma-buf/heaps/system_heap.c:499 system_heap_allocate()
>       warn: passing positive error code 's32min-(-1),1' to 'ERR_PTR'
> 
> drivers/dma-buf/heaps/system_heap.c
>     459         if (cc_shared) {
>     460                 for_each_sgtable_sg(table, sg, i) {
>     461                         ret = 
> system_heap_set_page_decrypted(sg_page(sg));
>     462                         if (ret)
>     463                                 goto free_pages;
> 
> It kind of looks like system_heap_set_page_decrypted() can return 1.
> 
>     464                 }
>     465         }
>     466 
>     467         /* create the dmabuf */
>     468         exp_info.exp_name = dma_heap_get_name(heap);
>     469         exp_info.ops = &system_heap_buf_ops;
>     470         exp_info.size = buffer->len;
>     471         exp_info.flags = fd_flags;
>     472         exp_info.priv = buffer;
>     473         dmabuf = dma_buf_export(&exp_info);
>     474         if (IS_ERR(dmabuf)) {
>     475                 ret = PTR_ERR(dmabuf);
>     476                 goto free_pages;
>     477         }
>     478         return dmabuf;
>     479 
>     480 free_pages:
>     481         for_each_sgtable_sg(table, sg, i) {
>     482                 struct page *p = sg_page(sg);
>     483 
>     484                 /*
>     485                  * Intentionally leak pages that cannot be 
> re-encrypted
>     486                  * to prevent shared memory from being reused.
>     487                  */
>     488                 if (buffer->cc_shared &&
>     489                     system_heap_set_page_encrypted(p))
>     490                         continue;
>     491                 __free_pages(p, compound_order(p));
>     492         }
>     493         sg_free_table(table);
>     494 free_buffer:
>     495         list_for_each_entry_safe(page, tmp_page, &pages, lru)
>     496                 __free_pages(page, compound_order(page));
>     497         kfree(buffer);
>     498 
> --> 499         return ERR_PTR(ret);
>     500 }
> 
> The problem is that add_to_pagemap() returns PM_END_OF_BUFFER (1)
> which is used by pagemap_read() and nowhere else.  The call tree
> is:
> 
> system_heap_allocate()
> system_heap_set_page_decrypted()
> set_memory_decrypted()
> realm_set_memory_decrypted()
> __set_memory_enc_dec()
> __change_memory_common()
> update_range_prot()
> walk_kernel_page_table_range_lockless()
> walk_pgd_range()
> pagemap_pte_hole()
> add_to_pagemap()
> 
> This code seems sort of old and I guess no one has reported the bug
> so maybe it's a false positive, but it feels like it's asking for
> problems to return the PM_END_OF_BUFFER.  There aren't any comments
> on any of those functions above explaining what return values are
> expected.
> 
> This email is a free service from the Smatch-CI project [smatch.sf.net].
> 
> regards,
> dan carpenter

Reply via email to