mirror of https://github.com/mpv-player/mpv
options: fix relative time parsing
Currently relative time parsing is buggy when any of the non-leading units are non zero. For example, "-1:30" should result in -90 but currently it results in -30 (as a result of `-60 + 30`). Also reject timestamps where non-leading units are out of range. E.g. "1:100" would be rejected, but "100" will still be accepted as 100 seconds.
This commit is contained in:
parent
8a7cd20480
commit
a173b47748
|
@ -2651,9 +2651,18 @@ static int parse_timestring(struct bstr str, double *time, char endchar)
|
|||
int h, m, len;
|
||||
double s;
|
||||
*time = 0; /* ensure initialization for error cases */
|
||||
bool neg = bstr_eatstart0(&str, "-");
|
||||
if (!neg)
|
||||
bstr_eatstart0(&str, "+");
|
||||
if (bstrchr(str, '-') >= 0 || bstrchr(str, '+') >= 0)
|
||||
return 0; /* the timestamp shouldn't contain anymore +/- after this point */
|
||||
if (bstr_sscanf(str, "%d:%d:%lf%n", &h, &m, &s, &len) >= 3) {
|
||||
if (m >= 60 || s >= 60)
|
||||
return 0; /* minutes or seconds are out of range */
|
||||
*time = 3600 * h + 60 * m + s;
|
||||
} else if (bstr_sscanf(str, "%d:%lf%n", &m, &s, &len) >= 2) {
|
||||
if (s >= 60)
|
||||
return 0; /* seconds are out of range */
|
||||
*time = 60 * m + s;
|
||||
} else if (bstr_sscanf(str, "%lf%n", &s, &len) >= 1) {
|
||||
*time = s;
|
||||
|
@ -2664,6 +2673,8 @@ static int parse_timestring(struct bstr str, double *time, char endchar)
|
|||
return 0; /* invalid extra characters at the end */
|
||||
if (!isfinite(*time))
|
||||
return 0;
|
||||
if (neg)
|
||||
*time = -*time;
|
||||
return len;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue