[FFmpeg-cvslog] af_pan: Fix sscanf formats to work with buggy sscanf implementations
Hendrik Leppkes
git at videolan.org
Sun Sep 16 01:51:19 CEST 2012
ffmpeg | branch: master | Hendrik Leppkes <h.leppkes at gmail.com> | Fri Sep 14 12:45:34 2012 -0400| [e3a1eb9edf65edda301f3a727f11e0224b9f5ae2] | committer: Derek Buitenhuis
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 at gmail.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e3a1eb9edf65edda301f3a727f11e0224b9f5ae2
---
libavfilter/af_pan.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/libavfilter/af_pan.c b/libavfilter/af_pan.c
index 753522b..80a912e 100644
--- a/libavfilter/af_pan.c
+++ b/libavfilter/af_pan.c
@@ -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];
More information about the ffmpeg-cvslog
mailing list