diff options
author | Andrey Smirnov <andrew.smirnov@gmail.com> | 2018-10-16 12:15:42 -0700 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-10-18 09:02:24 +0200 |
commit | 3e06eceaf441cfbe02dc4c436dc77ac28a0e5cb9 (patch) | |
tree | cf56324d9dc49ad6bfa555b86668092387b21ce8 /drivers/base | |
parent | e317adeeb7c50a5eeb0a88da39857c7cc6f9b366 (diff) | |
download | barebox-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.c | 23 |
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; |