Hello,

I came along another function implementation where I got the impression that
the function “memdup_user” could also be used there in a way which is similar
to an existing source code transformation approach by a small script for
the semantic patch language.

SmPL script:
https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/tree/scripts/coccinelle/api/memdup_user.cocci?id=632571b1bee00494aef749512d9f3290dfba0ead#n1

@refactoring@
expression code, count, from, to, size;
identifier label, log;
@@
 to =
-     kcalloc(count, size, GFP_KERNEL)
+     memdup_user(from, size * count)
 ;
 if (
-    !to
+    IS_ERR(to)
                || ...) {
-   code = -ENOMEM;
-   goto label;
-}
-code = copy_from_user(to, from, (size) * (count));
-if (code) {
    ...
    log(...,
-       code
+       PTR_ERR(to)
        , ...);
    code = -ENOMEM;
    goto label;
 }


Source file:
https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/tree/drivers/infiniband/hw/hfi1/user_sdma.c?id=632571b1bee00494aef749512d9f3290dfba0ead#n718

int hfi1_user_sdma_process_request(struct file *fp, struct iovec *iovec,
                                   unsigned long dim, unsigned long *count)
{
        /*
         * ...
         */
        if (req_opcode(req->info.ctrl) == EXPECTED) {
                u16 ntids = iovec[idx].iov_len / sizeof(*req->tids);

                if (!ntids || ntids > MAX_TID_PAIR_ENTRIES) {
                        ret = -EINVAL;
                        goto free_req;
                }
                req->tids = kcalloc(ntids, sizeof(*req->tids), GFP_KERNEL);
                if (!req->tids) {
                        ret = -ENOMEM;
                        goto free_req;
                }
                /*
                 * ...
                 */
                ret = copy_from_user(req->tids, iovec[idx].iov_base,
                                     ntids * sizeof(*req->tids));
                if (ret) {
                        SDMA_DBG(req, "Failed to copy %d TIDs (%d)",
                                 ntids, ret);
                        ret = -EFAULT;
                        goto free_req;
                }
                req->n_tids = ntids;
                idx++;
        }
        /*
         * ...
         */
        return 0;
free_req:
        user_sdma_free_request(req, true);
        if (req_queued)
                pq_update(pq);
        set_comp_state(pq, cq, info.comp_idx, ERROR, req->status);
        return ret;
}


elfring@Sonne:~/Projekte/Coccinelle/janitor> spatch.opt 
replace_kcalloc_by_memdup_user-draft1.cocci ../Probe/user_sdma-excerpt1.c
…
refactoring: position variables or mixed modifs interfere with comm_assoc iso
bool (bool !to
  >>> IS_ERR(to)
 || ...)
…


The software combination “Coccinelle 1.0.6-00093-ge1776d7b (OCaml 4.03.0)”
does not like this change attempt so far.
Which details should I reconsider next?

Regards,
Markus
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci

Reply via email to