From: kernel test robot <lkp@intel.com>
To: kbuild@lists.01.org
Subject: Re: [PATCH v2 3/4] of: dynamic: add of_node_alloc()
Date: Fri, 03 Jun 2022 03:29:45 +0800 [thread overview]
Message-ID: <202206030309.JE6IWFhp-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 35047 bytes --]
::::::
:::::: Manual check reason: "low confidence static check warning: drivers/of/dynamic.c:457:3: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]"
::::::
CC: llvm(a)lists.linux.dev
CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
In-Reply-To: <20220601081801.348571-4-clement.leger@bootlin.com>
References: <20220601081801.348571-4-clement.leger@bootlin.com>
TO: "Clément Léger" <clement.leger@bootlin.com>
TO: Michael Ellerman <mpe@ellerman.id.au>
TO: Benjamin Herrenschmidt <benh@kernel.crashing.org>
TO: Paul Mackerras <paulus@samba.org>
TO: Rob Herring <robh+dt@kernel.org>
TO: Frank Rowand <frowand.list@gmail.com>
TO: Nathan Lynch <nathanl@linux.ibm.com>
TO: Laurent Dufour <ldufour@linux.ibm.com>
TO: Daniel Henrique Barboza <danielhb413@gmail.com>
TO: David Gibson <david@gibson.dropbear.id.au>
TO: Andrew Morton <akpm@linux-foundation.org>
CC: Linux Memory Management List <linux-mm@kvack.org>
TO: David Hildenbrand <david@redhat.com>
TO: Ohhoon Kwon <ohoono.kwon@samsung.com>
TO: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com>
TO: YueHaibing <yuehaibing@huawei.com>
CC: devicetree(a)vger.kernel.org
CC: "Clément Léger" <clement.leger@bootlin.com>
CC: Steen Hegelund <steen.hegelund@microchip.com>
CC: linux-kernel(a)vger.kernel.org
CC: Lizhi Hou <lizhi.hou@xilinx.com>
CC: Allan Nielsen <allan.nielsen@microchip.com>
CC: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
CC: Bjorn Helgaas <helgaas@kernel.org>
CC: linuxppc-dev(a)lists.ozlabs.org
CC: Horatiu Vultur <horatiu.vultur@microchip.com>
Hi "Clément,
I love your patch! Perhaps something to improve:
[auto build test WARNING on robh/for-next]
[also build test WARNING on powerpc/next v5.18 next-20220602]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/intel-lab-lkp/linux/commits/Cl-ment-L-ger/of-add-of_property_alloc-free-and-of_node_alloc/20220601-162238
base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
:::::: branch date: 35 hours ago
:::::: commit date: 35 hours ago
config: arm-randconfig-c002-20220531 (https://download.01.org/0day-ci/archive/20220603/202206030309.JE6IWFhp-lkp(a)intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project c825abd6b0198fb088d9752f556a70705bc99dfd)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install arm cross compiling tool for clang build
# apt-get install binutils-arm-linux-gnueabi
# https://github.com/intel-lab-lkp/linux/commit/5e1a38b0a68ad3b47e2c0b34cbcde600327e1b89
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Cl-ment-L-ger/of-add-of_property_alloc-free-and-of_node_alloc/20220601-162238
git checkout 5e1a38b0a68ad3b47e2c0b34cbcde600327e1b89
# save the config file
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm clang-analyzer
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
clang-analyzer warnings: (new ones prefixed by >>)
cpu,
channel,
clk,
name,
consider reordering the fields or adding explicit padding members [clang-analyzer-optin.performance.Padding]
struct ingenic_tcu_timer {
~~~~~~~^~~~~~~~~~~~~~~~~~~
drivers/clocksource/ingenic-timer.c:32:8: note: Excessive padding in 'struct ingenic_tcu_timer' (44 padding bytes, where 12 is optimal). Optimal fields order: cevt, cpu, channel, clk, name, consider reordering the fields or adding explicit padding members
struct ingenic_tcu_timer {
~~~~~~~^~~~~~~~~~~~~~~~~~~
drivers/clocksource/ingenic-timer.c:176:2: warning: Call to function 'snprintf' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'snprintf_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
snprintf(timer->name, sizeof(timer->name), "TCU%u", timer->channel);
^~~~~~~~
drivers/clocksource/ingenic-timer.c:176:2: note: Call to function 'snprintf' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'snprintf_s' in case of C11
snprintf(timer->name, sizeof(timer->name), "TCU%u", timer->channel);
^~~~~~~~
Suppressed 16 warnings (16 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
44 warnings generated.
Suppressed 44 warnings (44 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
44 warnings generated.
Suppressed 44 warnings (44 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
44 warnings generated.
Suppressed 44 warnings (44 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
15 warnings generated.
Suppressed 15 warnings (15 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
15 warnings generated.
Suppressed 15 warnings (15 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
18 warnings generated.
drivers/of/property.c:585:2: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(endpoint, 0, sizeof(*endpoint));
^~~~~~
drivers/of/property.c:585:2: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(endpoint, 0, sizeof(*endpoint));
^~~~~~
drivers/of/property.c:923:19: warning: Access to field 'full_name' results in a dereference of a null pointer [clang-analyzer-core.NullDereference]
return kbasename(to_of_node(fwnode)->full_name);
^
include/linux/of.h:161:2: note: expanded from macro 'to_of_node'
({ \
^
drivers/of/property.c:923:19: note: '?' condition is false
return kbasename(to_of_node(fwnode)->full_name);
^
include/linux/of.h:164:3: note: expanded from macro 'to_of_node'
is_of_node(__to_of_node_fwnode) ? \
^
drivers/of/property.c:923:19: note: Access to field 'full_name' results in a dereference of a null pointer
return kbasename(to_of_node(fwnode)->full_name);
^
include/linux/of.h:161:2: note: expanded from macro 'to_of_node'
({ \
^
drivers/of/property.c:929:7: warning: Access to field 'parent' results in a dereference of a null pointer [clang-analyzer-core.NullDereference]
if (!to_of_node(fwnode)->parent)
^
include/linux/of.h:161:2: note: expanded from macro 'to_of_node'
({ \
^
drivers/of/property.c:929:7: note: '?' condition is false
if (!to_of_node(fwnode)->parent)
^
include/linux/of.h:164:3: note: expanded from macro 'to_of_node'
is_of_node(__to_of_node_fwnode) ? \
^
drivers/of/property.c:929:7: note: Access to field 'parent' results in a dereference of a null pointer
if (!to_of_node(fwnode)->parent)
^
include/linux/of.h:161:2: note: expanded from macro 'to_of_node'
({ \
^
Suppressed 15 warnings (15 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
13 warnings generated.
Suppressed 13 warnings (13 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
36 warnings generated.
drivers/of/dynamic.c:240:2: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(&rd, 0, sizeof(rd));
^~~~~~
drivers/of/dynamic.c:240:2: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(&rd, 0, sizeof(rd));
^~~~~~
drivers/of/dynamic.c:293:2: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(&rd, 0, sizeof(rd));
^~~~~~
drivers/of/dynamic.c:293:2: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(&rd, 0, sizeof(rd));
^~~~~~
drivers/of/dynamic.c:417:3: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(prop->value, value, len);
^~~~~~
drivers/of/dynamic.c:417:3: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(prop->value, value, len);
^~~~~~
>> drivers/of/dynamic.c:457:3: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]
strcpy((char *)node->full_name, name);
^~~~~~
drivers/of/dynamic.c:457:3: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119
strcpy((char *)node->full_name, name);
^~~~~~
drivers/of/dynamic.c:552:2: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(rce, ce, sizeof(*rce));
^~~~~~
drivers/of/dynamic.c:552:2: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(rce, ce, sizeof(*rce));
^~~~~~
drivers/of/dynamic.c:594:3: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(&rd, 0, sizeof(rd));
^~~~~~
drivers/of/dynamic.c:594:3: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(&rd, 0, sizeof(rd));
^~~~~~
drivers/of/dynamic.c:723:2: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(ocs, 0, sizeof(*ocs));
^~~~~~
drivers/of/dynamic.c:723:2: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(ocs, 0, sizeof(*ocs));
^~~~~~
Suppressed 29 warnings (29 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
51 warnings generated.
drivers/media/cec/platform/cros-ec/cros-ec-cec.c:48:2: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(cros_ec_cec->rx_msg.msg, cec_message, len);
^~~~~~
drivers/media/cec/platform/cros-ec/cros-ec-cec.c:48:2: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(cros_ec_cec->rx_msg.msg, cec_message, len);
^~~~~~
drivers/media/cec/platform/cros-ec/cros-ec-cec.c:130:2: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(msg.data.msg, cec_msg->msg, cec_msg->len);
^~~~~~
drivers/media/cec/platform/cros-ec/cros-ec-cec.c:130:2: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(msg.data.msg, cec_msg->msg, cec_msg->len);
^~~~~~
Suppressed 49 warnings (42 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
42 warnings generated.
Suppressed 42 warnings (42 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
44 warnings generated.
drivers/media/cec/platform/meson/ao-cec.c:432:10: warning: The left operand of '!=' is a garbage value [clang-analyzer-core.UndefinedBinaryOperatorResult]
if (reg != RX_DONE)
^
drivers/media/cec/platform/meson/ao-cec.c:476:6: note: Assuming the condition is false
if (stat & CEC_INTR_TX)
^~~~~~~~~~~~~~~~~~
drivers/media/cec/platform/meson/ao-cec.c:476:2: note: Taking false branch
if (stat & CEC_INTR_TX)
^
drivers/media/cec/platform/meson/ao-cec.c:479:2: note: Calling 'meson_ao_cec_irq_rx'
meson_ao_cec_irq_rx(ao_cec);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/media/cec/platform/meson/ao-cec.c:429:2: note: 'reg' declared without an initial value
u8 reg;
^~~~~~
drivers/media/cec/platform/meson/ao-cec.c:431:2: note: Calling 'meson_ao_cec_read'
meson_ao_cec_read(ao_cec, CEC_RX_MSG_STATUS, ®, &ret);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/media/cec/platform/meson/ao-cec.c:248:12: note: Taking false branch
u32 reg = FIELD_PREP(CEC_RW_ADDR, address);
^
include/linux/bitfield.h:114:3: note: expanded from macro 'FIELD_PREP'
__BF_FIELD_CHECK(_mask, 0ULL, _val, "FIELD_PREP: "); \
^
include/linux/bitfield.h:65:3: note: expanded from macro '__BF_FIELD_CHECK'
BUILD_BUG_ON_MSG(!__builtin_constant_p(_mask), \
^
include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^
include/linux/compiler_types.h:352:2: note: expanded from macro 'compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
^
include/linux/compiler_types.h:340:2: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
^
include/linux/compiler_types.h:332:3: note: expanded from macro '__compiletime_assert'
if (!(condition)) \
^
drivers/media/cec/platform/meson/ao-cec.c:248:12: note: Loop condition is false. Exiting loop
u32 reg = FIELD_PREP(CEC_RW_ADDR, address);
^
include/linux/bitfield.h:114:3: note: expanded from macro 'FIELD_PREP'
__BF_FIELD_CHECK(_mask, 0ULL, _val, "FIELD_PREP: "); \
^
include/linux/bitfield.h:65:3: note: expanded from macro '__BF_FIELD_CHECK'
BUILD_BUG_ON_MSG(!__builtin_constant_p(_mask), \
^
include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^
include/linux/compiler_types.h:352:2: note: expanded from macro 'compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
^
include/linux/compiler_types.h:340:2: note: expanded from macro '_compiletime_assert'
__compiletime_assert(condition, msg, prefix, suffix)
vim +457 drivers/of/dynamic.c
d8c50088417ebf Pantelis Antoniou 2014-07-04 283
d8c50088417ebf Pantelis Antoniou 2014-07-04 284 /**
d8c50088417ebf Pantelis Antoniou 2014-07-04 285 * of_detach_node() - "Unplug" a node from the device tree.
3cb025d935d2a1 Lee Jones 2021-03-18 286 * @np: Pointer to the caller's Device Node
d8c50088417ebf Pantelis Antoniou 2014-07-04 287 */
d8c50088417ebf Pantelis Antoniou 2014-07-04 288 int of_detach_node(struct device_node *np)
d8c50088417ebf Pantelis Antoniou 2014-07-04 289 {
f5242e5a883bf1 Grant Likely 2014-11-24 290 struct of_reconfig_data rd;
d8c50088417ebf Pantelis Antoniou 2014-07-04 291 unsigned long flags;
d8c50088417ebf Pantelis Antoniou 2014-07-04 292
f5242e5a883bf1 Grant Likely 2014-11-24 @293 memset(&rd, 0, sizeof(rd));
f5242e5a883bf1 Grant Likely 2014-11-24 294 rd.dn = np;
f5242e5a883bf1 Grant Likely 2014-11-24 295
8a2b22a2595bf8 Grant Likely 2014-07-23 296 mutex_lock(&of_mutex);
d8c50088417ebf Pantelis Antoniou 2014-07-04 297 raw_spin_lock_irqsave(&devtree_lock, flags);
d8c50088417ebf Pantelis Antoniou 2014-07-04 298 __of_detach_node(np);
6afc0dc3815735 Grant Likely 2014-06-26 299 raw_spin_unlock_irqrestore(&devtree_lock, flags);
6afc0dc3815735 Grant Likely 2014-06-26 300
8a2b22a2595bf8 Grant Likely 2014-07-23 301 __of_detach_node_sysfs(np);
8a2b22a2595bf8 Grant Likely 2014-07-23 302 mutex_unlock(&of_mutex);
259092a35c7e11 Grant Likely 2014-07-16 303
f5242e5a883bf1 Grant Likely 2014-11-24 304 of_reconfig_notify(OF_RECONFIG_DETACH_NODE, &rd);
259092a35c7e11 Grant Likely 2014-07-16 305
58fb82ccbccca2 Ding Xiang 2020-03-30 306 return 0;
6afc0dc3815735 Grant Likely 2014-06-26 307 }
bb91f923d17657 Gavin Shan 2016-05-03 308 EXPORT_SYMBOL_GPL(of_detach_node);
6afc0dc3815735 Grant Likely 2014-06-26 309
070ea018fa092f Lixin Wang 2017-10-23 310 static void property_list_free(struct property *prop_list)
070ea018fa092f Lixin Wang 2017-10-23 311 {
070ea018fa092f Lixin Wang 2017-10-23 312 struct property *prop, *next;
070ea018fa092f Lixin Wang 2017-10-23 313
070ea018fa092f Lixin Wang 2017-10-23 314 for (prop = prop_list; prop != NULL; prop = next) {
070ea018fa092f Lixin Wang 2017-10-23 315 next = prop->next;
277b84148f45b3 Clément Léger 2022-06-01 316 of_property_free(prop);
070ea018fa092f Lixin Wang 2017-10-23 317 }
070ea018fa092f Lixin Wang 2017-10-23 318 }
070ea018fa092f Lixin Wang 2017-10-23 319
6afc0dc3815735 Grant Likely 2014-06-26 320 /**
6afc0dc3815735 Grant Likely 2014-06-26 321 * of_node_release() - release a dynamically allocated node
3cb025d935d2a1 Lee Jones 2021-03-18 322 * @kobj: kernel object of the node to be released
6afc0dc3815735 Grant Likely 2014-06-26 323 *
6afc0dc3815735 Grant Likely 2014-06-26 324 * In of_node_put() this function is passed to kref_put() as the destructor.
6afc0dc3815735 Grant Likely 2014-06-26 325 */
6afc0dc3815735 Grant Likely 2014-06-26 326 void of_node_release(struct kobject *kobj)
6afc0dc3815735 Grant Likely 2014-06-26 327 {
6afc0dc3815735 Grant Likely 2014-06-26 328 struct device_node *node = kobj_to_device_node(kobj);
6afc0dc3815735 Grant Likely 2014-06-26 329
6afc0dc3815735 Grant Likely 2014-06-26 330 /* We should never be releasing nodes that haven't been detached. */
6afc0dc3815735 Grant Likely 2014-06-26 331 if (!of_node_check_flag(node, OF_DETACHED)) {
0d638a07d3a1e9 Rob Herring 2017-06-01 332 pr_err("ERROR: Bad of_node_put() on %pOF\n", node);
6afc0dc3815735 Grant Likely 2014-06-26 333 dump_stack();
6afc0dc3815735 Grant Likely 2014-06-26 334 return;
6afc0dc3815735 Grant Likely 2014-06-26 335 }
6afc0dc3815735 Grant Likely 2014-06-26 336 if (!of_node_check_flag(node, OF_DYNAMIC))
6afc0dc3815735 Grant Likely 2014-06-26 337 return;
6afc0dc3815735 Grant Likely 2014-06-26 338
144552c7869253 Frank Rowand 2018-10-04 339 if (of_node_check_flag(node, OF_OVERLAY)) {
144552c7869253 Frank Rowand 2018-10-04 340
144552c7869253 Frank Rowand 2018-10-04 341 if (!of_node_check_flag(node, OF_OVERLAY_FREE_CSET)) {
144552c7869253 Frank Rowand 2018-10-04 342 /* premature refcount of zero, do not free memory */
144552c7869253 Frank Rowand 2018-10-04 343 pr_err("ERROR: memory leak before free overlay changeset, %pOF\n",
144552c7869253 Frank Rowand 2018-10-04 344 node);
144552c7869253 Frank Rowand 2018-10-04 345 return;
144552c7869253 Frank Rowand 2018-10-04 346 }
144552c7869253 Frank Rowand 2018-10-04 347
144552c7869253 Frank Rowand 2018-10-04 348 /*
144552c7869253 Frank Rowand 2018-10-04 349 * If node->properties non-empty then properties were added
144552c7869253 Frank Rowand 2018-10-04 350 * to this node either by different overlay that has not
144552c7869253 Frank Rowand 2018-10-04 351 * yet been removed, or by a non-overlay mechanism.
144552c7869253 Frank Rowand 2018-10-04 352 */
144552c7869253 Frank Rowand 2018-10-04 353 if (node->properties)
144552c7869253 Frank Rowand 2018-10-04 354 pr_err("ERROR: %s(), unexpected properties in %pOF\n",
144552c7869253 Frank Rowand 2018-10-04 355 __func__, node);
144552c7869253 Frank Rowand 2018-10-04 356 }
144552c7869253 Frank Rowand 2018-10-04 357
070ea018fa092f Lixin Wang 2017-10-23 358 property_list_free(node->properties);
070ea018fa092f Lixin Wang 2017-10-23 359 property_list_free(node->deadprops);
7b337cb3ebde38 Saravana Kannan 2020-11-20 360 fwnode_links_purge(of_fwnode_handle(node));
6afc0dc3815735 Grant Likely 2014-06-26 361
5e1a38b0a68ad3 Clément Léger 2022-06-01 362 if (node->full_name != (const char *) (node + 1))
6afc0dc3815735 Grant Likely 2014-06-26 363 kfree(node->full_name);
5e1a38b0a68ad3 Clément Léger 2022-06-01 364
6afc0dc3815735 Grant Likely 2014-06-26 365 kfree(node->data);
6afc0dc3815735 Grant Likely 2014-06-26 366 kfree(node);
6afc0dc3815735 Grant Likely 2014-06-26 367 }
698433963b98d6 Pantelis Antoniou 2014-07-04 368
698433963b98d6 Pantelis Antoniou 2014-07-04 369 /**
277b84148f45b3 Clément Léger 2022-06-01 370 * of_property_free - Free a property allocated dynamically.
277b84148f45b3 Clément Léger 2022-06-01 371 * @prop: Property to be freed
277b84148f45b3 Clément Léger 2022-06-01 372 */
277b84148f45b3 Clément Léger 2022-06-01 373 void of_property_free(const struct property *prop)
277b84148f45b3 Clément Léger 2022-06-01 374 {
277b84148f45b3 Clément Léger 2022-06-01 375 if (!of_property_check_flag(prop, OF_DYNAMIC))
277b84148f45b3 Clément Léger 2022-06-01 376 return;
277b84148f45b3 Clément Léger 2022-06-01 377
277b84148f45b3 Clément Léger 2022-06-01 378 if (prop->value != prop + 1)
277b84148f45b3 Clément Léger 2022-06-01 379 kfree(prop->value);
277b84148f45b3 Clément Léger 2022-06-01 380
277b84148f45b3 Clément Léger 2022-06-01 381 kfree(prop->name);
277b84148f45b3 Clément Léger 2022-06-01 382 kfree(prop);
277b84148f45b3 Clément Léger 2022-06-01 383 }
277b84148f45b3 Clément Léger 2022-06-01 384 EXPORT_SYMBOL(of_property_free);
277b84148f45b3 Clément Léger 2022-06-01 385
277b84148f45b3 Clément Léger 2022-06-01 386 /**
277b84148f45b3 Clément Léger 2022-06-01 387 * of_property_alloc - Allocate a property dynamically.
277b84148f45b3 Clément Léger 2022-06-01 388 * @name: Name of the new property
277b84148f45b3 Clément Léger 2022-06-01 389 * @value: Value that will be copied into the new property value or NULL
277b84148f45b3 Clément Léger 2022-06-01 390 * if only @len allocation is needed.
277b84148f45b3 Clément Léger 2022-06-01 391 * @len: Length of new property value and if @value is provided, the
277b84148f45b3 Clément Léger 2022-06-01 392 * length of the value to be copied
698433963b98d6 Pantelis Antoniou 2014-07-04 393 * @allocflags: Allocation flags (typically pass GFP_KERNEL)
698433963b98d6 Pantelis Antoniou 2014-07-04 394 *
277b84148f45b3 Clément Léger 2022-06-01 395 * Create a property by dynamically allocating the memory of both the
27b3383a143212 Geert Uytterhoeven 2014-10-22 396 * property structure and the property name & contents. The property's
698433963b98d6 Pantelis Antoniou 2014-07-04 397 * flags have the OF_DYNAMIC bit set so that we can differentiate between
698433963b98d6 Pantelis Antoniou 2014-07-04 398 * dynamically allocated properties and not.
8c8239c2c1fb82 Rob Herring 2021-03-25 399 *
8c8239c2c1fb82 Rob Herring 2021-03-25 400 * Return: The newly allocated property or NULL on out of memory error.
698433963b98d6 Pantelis Antoniou 2014-07-04 401 */
277b84148f45b3 Clément Léger 2022-06-01 402 struct property *of_property_alloc(const char *name, const void *value,
277b84148f45b3 Clément Léger 2022-06-01 403 size_t len, gfp_t allocflags)
698433963b98d6 Pantelis Antoniou 2014-07-04 404 {
277b84148f45b3 Clément Léger 2022-06-01 405 struct property *prop;
698433963b98d6 Pantelis Antoniou 2014-07-04 406
277b84148f45b3 Clément Léger 2022-06-01 407 prop = kzalloc(sizeof(*prop) + len, allocflags);
277b84148f45b3 Clément Léger 2022-06-01 408 if (!prop)
698433963b98d6 Pantelis Antoniou 2014-07-04 409 return NULL;
698433963b98d6 Pantelis Antoniou 2014-07-04 410
277b84148f45b3 Clément Léger 2022-06-01 411 prop->name = kstrdup(name, allocflags);
277b84148f45b3 Clément Léger 2022-06-01 412 if (!prop->name)
277b84148f45b3 Clément Léger 2022-06-01 413 goto out_err;
277b84148f45b3 Clément Léger 2022-06-01 414
277b84148f45b3 Clément Léger 2022-06-01 415 prop->value = prop + 1;
277b84148f45b3 Clément Léger 2022-06-01 416 if (value)
277b84148f45b3 Clément Léger 2022-06-01 417 memcpy(prop->value, value, len);
277b84148f45b3 Clément Léger 2022-06-01 418
277b84148f45b3 Clément Léger 2022-06-01 419 prop->length = len;
277b84148f45b3 Clément Léger 2022-06-01 420 of_property_set_flag(prop, OF_DYNAMIC);
698433963b98d6 Pantelis Antoniou 2014-07-04 421
277b84148f45b3 Clément Léger 2022-06-01 422 return prop;
698433963b98d6 Pantelis Antoniou 2014-07-04 423
277b84148f45b3 Clément Léger 2022-06-01 424 out_err:
277b84148f45b3 Clément Léger 2022-06-01 425 of_property_free(prop);
698433963b98d6 Pantelis Antoniou 2014-07-04 426
698433963b98d6 Pantelis Antoniou 2014-07-04 427 return NULL;
698433963b98d6 Pantelis Antoniou 2014-07-04 428 }
277b84148f45b3 Clément Léger 2022-06-01 429 EXPORT_SYMBOL(of_property_alloc);
698433963b98d6 Pantelis Antoniou 2014-07-04 430
5e1a38b0a68ad3 Clément Léger 2022-06-01 431 /**
5e1a38b0a68ad3 Clément Léger 2022-06-01 432 * of_node_alloc - Allocate a node dynamically.
5e1a38b0a68ad3 Clément Léger 2022-06-01 433 * @name: Node name
5e1a38b0a68ad3 Clément Léger 2022-06-01 434 * @allocflags: Allocation flags (typically pass GFP_KERNEL)
5e1a38b0a68ad3 Clément Léger 2022-06-01 435 *
5e1a38b0a68ad3 Clément Léger 2022-06-01 436 * Create a node by dynamically allocating the memory of both the
5e1a38b0a68ad3 Clément Léger 2022-06-01 437 * node structure and the node name & contents. The node's
5e1a38b0a68ad3 Clément Léger 2022-06-01 438 * flags have the OF_DYNAMIC & OF_DETACHED bit set so that we can
5e1a38b0a68ad3 Clément Léger 2022-06-01 439 * differentiate between dynamically allocated nodes and not.
5e1a38b0a68ad3 Clément Léger 2022-06-01 440 *
5e1a38b0a68ad3 Clément Léger 2022-06-01 441 * Return: The newly allocated node or NULL on out of memory error.
5e1a38b0a68ad3 Clément Léger 2022-06-01 442 */
5e1a38b0a68ad3 Clément Léger 2022-06-01 443 struct device_node *of_node_alloc(const char *name, gfp_t allocflags)
5e1a38b0a68ad3 Clément Léger 2022-06-01 444 {
5e1a38b0a68ad3 Clément Léger 2022-06-01 445 struct device_node *node;
5e1a38b0a68ad3 Clément Léger 2022-06-01 446 int name_len = 0;
5e1a38b0a68ad3 Clément Léger 2022-06-01 447
5e1a38b0a68ad3 Clément Léger 2022-06-01 448 if (name)
5e1a38b0a68ad3 Clément Léger 2022-06-01 449 name_len = strlen(name) + 1;
5e1a38b0a68ad3 Clément Léger 2022-06-01 450
5e1a38b0a68ad3 Clément Léger 2022-06-01 451 node = kzalloc(sizeof(*node) + name_len, allocflags);
5e1a38b0a68ad3 Clément Léger 2022-06-01 452 if (!node)
5e1a38b0a68ad3 Clément Léger 2022-06-01 453 return NULL;
5e1a38b0a68ad3 Clément Léger 2022-06-01 454
5e1a38b0a68ad3 Clément Léger 2022-06-01 455 if (name) {
5e1a38b0a68ad3 Clément Léger 2022-06-01 456 node->full_name = (const char *) (node + 1);
5e1a38b0a68ad3 Clément Léger 2022-06-01 @457 strcpy((char *)node->full_name, name);
5e1a38b0a68ad3 Clément Léger 2022-06-01 458 }
5e1a38b0a68ad3 Clément Léger 2022-06-01 459
5e1a38b0a68ad3 Clément Léger 2022-06-01 460 of_node_set_flag(node, OF_DYNAMIC);
5e1a38b0a68ad3 Clément Léger 2022-06-01 461 of_node_set_flag(node, OF_DETACHED);
5e1a38b0a68ad3 Clément Léger 2022-06-01 462 of_node_init(node);
5e1a38b0a68ad3 Clément Léger 2022-06-01 463
5e1a38b0a68ad3 Clément Léger 2022-06-01 464 return node;
5e1a38b0a68ad3 Clément Léger 2022-06-01 465 }
5e1a38b0a68ad3 Clément Léger 2022-06-01 466 EXPORT_SYMBOL(of_node_alloc);
5e1a38b0a68ad3 Clément Léger 2022-06-01 467
--
0-DAY CI Kernel Test Service
https://01.org/lkp
next reply other threads:[~2022-06-02 19:29 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-02 19:29 kernel test robot [this message]
-- strict thread matches above, loose matches on Subject: below --
2022-06-01 8:17 [PATCH v2 0/4] of: add of_property_alloc/free() and of_node_alloc() Clément Léger
2022-06-01 8:18 ` [PATCH v2 3/4] of: dynamic: add of_node_alloc() Clément Léger
2022-06-01 8:18 ` Clément Léger
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=202206030309.JE6IWFhp-lkp@intel.com \
--to=lkp@intel.com \
--cc=kbuild@lists.01.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.