mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-25 00:32:31 +00:00
af_pan: Fix sscanf formats to work with buggy sscanf implementations
Some implementations of sscanf do not handle a space before a trailing %n properly. As an example, MSVC's does this for the second insatnce in this patch, for an input of "0x3:c0=c1:c1=c0": 1) Match the final "c0" or "c1". 2) Realize it's at the end of the string. 3) Check for %n. 4) There is no %n, but a space instead. 5) Leave 'len' unitilialized. So, move it out of the sscanf format strings, and call skip_spaces instead. This bug does not affect skip_spaces since %n is the first and only formatting string. Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
This commit is contained in:
parent
d512e74dec
commit
e3a1eb9edf
@ -60,7 +60,7 @@ static int parse_channel_name(char **arg, int *rchannel, int *rnamed)
|
||||
int64_t layout, layout0;
|
||||
|
||||
/* try to parse a channel name, e.g. "FL" */
|
||||
if (sscanf(*arg, " %7[A-Z] %n", buf, &len)) {
|
||||
if (sscanf(*arg, "%7[A-Z]%n", buf, &len)) {
|
||||
layout0 = layout = av_get_channel_layout(buf);
|
||||
/* channel_id <- first set bit in layout */
|
||||
for (i = 32; i > 0; i >>= 1) {
|
||||
@ -78,7 +78,7 @@ static int parse_channel_name(char **arg, int *rchannel, int *rnamed)
|
||||
return 0;
|
||||
}
|
||||
/* try to parse a channel number, e.g. "c2" */
|
||||
if (sscanf(*arg, " c%d %n", &channel_id, &len) &&
|
||||
if (sscanf(*arg, "c%d%n", &channel_id, &len) &&
|
||||
channel_id >= 0 && channel_id < MAX_CHANNELS) {
|
||||
*rchannel = channel_id;
|
||||
*rnamed = 0;
|
||||
@ -143,6 +143,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args0)
|
||||
"Invalid out channel name \"%.8s\"\n", arg0);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
skip_spaces(&arg);
|
||||
if (*arg == '=') {
|
||||
arg++;
|
||||
} else if (*arg == '<') {
|
||||
@ -156,7 +157,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args0)
|
||||
/* gains */
|
||||
while (1) {
|
||||
gain = 1;
|
||||
if (sscanf(arg, " %lf %n* %n", &gain, &len, &len))
|
||||
if (sscanf(arg, "%lf%n *%n", &gain, &len, &len))
|
||||
arg += len;
|
||||
if (parse_channel_name(&arg, &in_ch_id, &named)){
|
||||
av_log(ctx, AV_LOG_ERROR,
|
||||
@ -170,6 +171,7 @@ static av_cold int init(AVFilterContext *ctx, const char *args0)
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
pan->gain[out_ch_id][in_ch_id] = gain;
|
||||
skip_spaces(&arg);
|
||||
if (!*arg)
|
||||
break;
|
||||
if (*arg != '+') {
|
||||
@ -177,7 +179,6 @@ static av_cold int init(AVFilterContext *ctx, const char *args0)
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
arg++;
|
||||
skip_spaces(&arg);
|
||||
}
|
||||
}
|
||||
pan->need_renumber = !!nb_in_channels[1];
|
||||
|
Loading…
Reference in New Issue
Block a user