Signed-off-by: Peter Mamonov <pmamonov@xxxxxxxxx> --- lib/misc.c | 46 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/lib/misc.c b/lib/misc.c index 62ddd6677..c7d5a0ca5 100644 --- a/lib/misc.c +++ b/lib/misc.c @@ -79,38 +79,56 @@ EXPORT_SYMBOL(strtoul_suffix); int parse_area_spec(const char *str, loff_t *start, loff_t *size) { char *endp; - loff_t end; + loff_t end, _start, _size; + int ret = -1; if (!isdigit(*str)) return -1; - *start = strtoull_suffix(str, &endp, 0); + _start = strtoull_suffix(str, &endp, 0); str = endp; if (!*str) { /* beginning given, but no size, assume maximum size */ - *size = ~0; - return 0; + _size = ~0; + ret = 0; } - if (*str == '-') { + if (ret && *str == '-') { /* beginning and end given */ - end = strtoull_suffix(str + 1, NULL, 0); - if (end < *start) { + if (!isdigit(*(str + 1))) + return ret; + + end = strtoull_suffix(str + 1, &endp, 0); + str = endp; + if (end < _start) { printf("end < start\n"); - return -1; + return ret; } - *size = end - *start + 1; - return 0; + _size = end - _start + 1; + ret = 0; } - if (*str == '+') { + if (ret && *str == '+') { /* beginning and size given */ - *size = strtoull_suffix(str + 1, NULL, 0); - return 0; + if (!isdigit(*(str + 1))) + return ret; + + _size = strtoull_suffix(str + 1, &endp, 0); + str = endp; + ret = 0; + } + + if (!ret && *str) + /* trailing symbols indicate invalid area spec */ + ret = -1; + + if (!ret) { + *start = _start; + *size = _size; } - return -1; + return ret; } EXPORT_SYMBOL(parse_area_spec); -- 2.11.0 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox