From: Dan Carpenter <dan.carpenter@oracle.com>
To: stephen.boyd@linaro.org
Cc: devicetree@vger.kernel.org
Subject: [bug report] of: Support parsing phandle argument lists through a nexus node
Date: Wed, 17 Mar 2021 16:09:00 +0300 [thread overview]
Message-ID: <YFH/bLGZo43quuc9@mwanda> (raw)
Hello Stephen Boyd,
The patch bd6f2fd5a1d5: "of: Support parsing phandle argument lists
through a nexus node" from Jan 30, 2018, leads to the following
static checker warning:
drivers/of/base.c:1592 of_parse_phandle_with_args_map()
warn: loop overwrites return value 'ret'
drivers/of/base.c
1590
1591 ret = -EINVAL;
^^^^^^^^^^^^^
This return is only used until part way through the first iteration.
For subsequent iterations, the code will return success in the case of
an error.
1592 while (cur) {
1593 /* Get the <list>-map property */
1594 map = of_get_property(cur, map_name, &map_len);
1595 if (!map) {
1596 ret = 0;
1597 goto free;
1598 }
1599 map_len /= sizeof(u32);
1600
1601 /* Get the <list>-map-mask property (optional) */
1602 mask = of_get_property(cur, mask_name, NULL);
1603 if (!mask)
1604 mask = dummy_mask;
1605 /* Iterate through <list>-map property */
1606 match = 0;
1607 while (map_len > (list_size + 1) && !match) {
1608 /* Compare specifiers */
1609 match = 1;
1610 for (i = 0; i < list_size; i++, map_len--)
1611 match &= !((match_array[i] ^ *map++) & mask[i]);
1612
1613 of_node_put(new);
1614 new = of_find_node_by_phandle(be32_to_cpup(map));
1615 map++;
1616 map_len--;
1617
1618 /* Check if not found */
1619 if (!new)
1620 goto put;
1621
1622 if (!of_device_is_available(new))
1623 match = 0;
1624
1625 ret = of_property_read_u32(new, cells_name, &new_size);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
"ret" set to zero here.
1626 if (ret)
1627 goto put;
1628
1629 /* Check for malformed properties */
1630 if (WARN_ON(new_size > MAX_PHANDLE_ARGS))
1631 goto put;
^^^^^^^^
Probably -EINVAL was intended here.
1632 if (map_len < new_size)
1633 goto put;
1634
1635 /* Move forward by new node's #<list>-cells amount */
1636 map += new_size;
1637 map_len -= new_size;
1638 }
1639 if (!match)
1640 goto put;
1641
1642 /* Get the <list>-map-pass-thru property (optional) */
1643 pass = of_get_property(cur, pass_name, NULL);
1644 if (!pass)
1645 pass = dummy_pass;
1646
1647 /*
1648 * Successfully parsed a <list>-map translation; copy new
1649 * specifier into the out_args structure, keeping the
1650 * bits specified in <list>-map-pass-thru.
1651 */
1652 match_array = map - new_size;
1653 for (i = 0; i < new_size; i++) {
1654 __be32 val = *(map - new_size + i);
1655
1656 if (i < list_size) {
1657 val &= ~pass[i];
1658 val |= cpu_to_be32(out_args->args[i]) & pass[i];
1659 }
1660
1661 out_args->args[i] = be32_to_cpu(val);
1662 }
1663 out_args->args_count = list_size = new_size;
1664 /* Iterate again with new provider */
1665 out_args->np = new;
1666 of_node_put(cur);
1667 cur = new;
1668 }
1669 put:
1670 of_node_put(cur);
1671 of_node_put(new);
1672 free:
1673 kfree(mask_name);
1674 kfree(map_name);
1675 kfree(cells_name);
1676 kfree(pass_name);
1677
1678 return ret;
1679 }
regards,
dan carpenter
reply other threads:[~2021-03-17 13:10 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YFH/bLGZo43quuc9@mwanda \
--to=dan.carpenter@oracle.com \
--cc=devicetree@vger.kernel.org \
--cc=stephen.boyd@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.