From 39428525c372e593f042c107e35e38b5409afc07 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sun, 18 Nov 2012 00:19:43 +0100 Subject: m_option: fix braindead --start, --length, --end option parsing bugs The option type m_option_type_rel_time was completely broken. It interpreted everything starting with a number as percent position. This is because sscanf() semantics are idiotic (trailing string doesn't need to be matched), and due to my own idiocy this was overlooked when testing. Fix by considering sscanf() evil and not using it. (bstr_sscanf() is a straight wrapper around sscanf()). Even if the percent code was fixed, there was another bug: it always interpreted times as negative (starting from end for --start). Fix the basic logic. --- core/m_option.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'core') diff --git a/core/m_option.c b/core/m_option.c index 693c95cf96..dcb849a34d 100644 --- a/core/m_option.c +++ b/core/m_option.c @@ -1259,16 +1259,16 @@ static int parse_rel_time(const m_option_t *opt, struct bstr name, return M_OPT_MISSING_PARAM; // Percent pos - double percent; - if (bstr_sscanf(param, "%lf%%", &percent) == 1) { - if (percent >= 0 && percent <= 100) { + if (bstr_endswith0(param, "%")) { + double percent = bstrtod(bstr_splice(param, 0, -1), ¶m); + if (param.len == 0 && percent >= 0 && percent <= 100) { t.type = REL_TIME_PERCENT; t.pos = percent; goto out; } } - double sign = bstr_eatstart0(¶m, "-") ? -1 : +1; + bool sign = bstr_eatstart0(¶m, "-"); double time; if (parse_timestring(param, &time, 0)) { t.type = sign ? REL_TIME_NEGATIVE : REL_TIME_ABSOLUTE; -- cgit v1.2.3