We will need to parse two more sysattrs in a follow-up patch, so factor this out for reuse. While at it switch to 64-bit strtoull: This may be more useful for future users and unlike atol doesn't invoke undefined behavior when parsing fails.
Signed-off-by: Ahmad Fatoum <a.fat...@pengutronix.de> --- src/libdt.c | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/src/libdt.c b/src/libdt.c index 2c994c647ac9..580b0b0ba769 100644 --- a/src/libdt.c +++ b/src/libdt.c @@ -2179,6 +2179,33 @@ static struct udev_device *device_find_mtd_partition(struct udev_device *dev, return NULL; } +/* + * udev_device_parse_sysattr_u64 - parse sysattr value as unsigned 64-bit integer + * @dev: the udev_device to extract the attribute from + * @attr: name of the attribute to lookup + * @outvalue: returns the value parsed out of the attribute + * + * returns 0 for success or negative error value on failure. + */ +static int udev_device_parse_sysattr_u64(struct udev_device *dev, const char *attr, + u64 *outvalue) +{ + char *endptr; + u64 value; + const char *str; + + str = udev_device_get_sysattr_value(dev, attr); + if (!str) + return -EINVAL; + + value = strtoull(str, &endptr, 0); + if (!*str || *endptr) + return -EINVAL; + + *outvalue = value; + return 0; +} + /* * device_find_block_device - extract device path from udev block device * @@ -2305,24 +2332,25 @@ static int udev_device_is_eeprom(struct udev_device *dev) * udev_parse_mtd - get information from a mtd udev_device * @dev: the udev_device to extract information from * @devpath: returns the devicepath under which the mtd device is accessible - * @size: returns the size of the mtd device + * @outsize: returns the size of the mtd device * * returns 0 for success or negative error value on failure. *devpath * will be valid on success and must be freed after usage. */ -static int udev_parse_mtd(struct udev_device *dev, char **devpath, size_t *size) +static int udev_parse_mtd(struct udev_device *dev, char **devpath, size_t *outsize) { - const char *sizestr; const char *outpath; + u64 size; + int ret; if (!udev_device_is_mtd(dev)) return -EINVAL; - sizestr = udev_device_get_sysattr_value(dev, "size"); - if (!sizestr) - return -EINVAL; + ret = udev_device_parse_sysattr_u64(dev, "size", &size); + if (ret) + return ret; - *size = atol(sizestr); + *outsize = size; outpath = udev_device_get_devnode(dev); if (!outpath) -- 2.39.2