summaryrefslogtreecommitdiffstats
path: root/drivers/base
diff options
context:
space:
mode:
authorAndrey Smirnov <andrew.smirnov@gmail.com>2018-10-16 12:15:42 -0700
committerSascha Hauer <s.hauer@pengutronix.de>2018-10-18 09:02:24 +0200
commit3e06eceaf441cfbe02dc4c436dc77ac28a0e5cb9 (patch)
treecf56324d9dc49ad6bfa555b86668092387b21ce8 /drivers/base
parente317adeeb7c50a5eeb0a88da39857c7cc6f9b366 (diff)
downloadbarebox-3e06eceaf441cfbe02dc4c436dc77ac28a0e5cb9.tar.gz
barebox-3e06eceaf441cfbe02dc4c436dc77ac28a0e5cb9.tar.xz
drivers: base: Convert device_d name to be dynamically allocated
Convert device_d name to be dynamically allocated in order to lift MAX_DRIVER_NAME length limit needed for commits that follow. Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/driver.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/drivers/base/driver.c b/drivers/base/driver.c
index b7720f31ab..1941a972cc 100644
--- a/drivers/base/driver.c
+++ b/drivers/base/driver.c
@@ -184,11 +184,9 @@ int register_device(struct device_d *new_device)
}
if (new_device->id != DEVICE_ID_SINGLE)
- snprintf(new_device->unique_name,
- sizeof(new_device->unique_name),
- FORMAT_DRIVER_NAME_ID,
- new_device->name,
- new_device->id);
+ new_device->unique_name = basprintf(FORMAT_DRIVER_NAME_ID,
+ new_device->name,
+ new_device->id);
debug ("register_device: %s\n", dev_name(new_device));
@@ -478,16 +476,29 @@ EXPORT_SYMBOL(dummy_probe);
* @dev: device
* @fmt: format string for the device's name
*
+ * NOTE: This function expects dev->name to be free()-able, so extra
+ * precautions needs to be taken when mixing its usage with manual
+ * assignement of device_d.name.
*/
int dev_set_name(struct device_d *dev, const char *fmt, ...)
{
va_list vargs;
int err;
+ /*
+ * Save old pointer in case we are overriding already set name
+ */
+ char *oldname = dev->name;
va_start(vargs, fmt);
- err = vsnprintf(dev->name, sizeof(dev->name), fmt, vargs);
+ err = vasprintf(&dev->name, fmt, vargs);
va_end(vargs);
+ /*
+ * Free old pointer, we do this after vasprintf call in case
+ * old device name was in one of vargs
+ */
+ free(oldname);
+
WARN_ON(err < 0);
return err;