aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-02-03 22:46:00 +0100
committerMax Kellermann <max@duempel.org>2009-02-03 22:51:44 +0100
commit824d299eb13e2fc4d03f5c4974a9c4f6511fd284 (patch)
tree5d4668233bc1b7919f119718b2e66491c60ab8f8
parentf3b73b824f849f7c1280a59ddb67f5c3d187a5af (diff)
downloadmpd-824d299eb13e2fc4d03f5c4974a9c4f6511fd284.tar.gz
mpd-824d299eb13e2fc4d03f5c4974a9c4f6511fd284.tar.xz
mpd-824d299eb13e2fc4d03f5c4974a9c4f6511fd284.zip
ffmpeg: fixed seek integer overflow
The "current" variable is used for calculating the seek destination, and was declared as "int". With very long song files, the 32 bit integer can overflow. ffmpeg expects an int64_t, which is very unlikely to overflow. Switch to int64_t.
Diffstat (limited to '')
-rw-r--r--NEWS1
-rw-r--r--src/decoder/ffmpeg_plugin.c7
2 files changed, 5 insertions, 3 deletions
diff --git a/NEWS b/NEWS
index c3980302e..0d213525e 100644
--- a/NEWS
+++ b/NEWS
@@ -39,6 +39,7 @@ ver 0.14.2 (2009/??/??)
- ffmpeg: added support for the tags comment, genre, year
- ffmpeg: don't warn of empty packet output
- ffmpeg: check if the time stamp is valid
+ - ffmpeg: fixed seek integer overflow
- wavpack: pass NULL if the .wvc file fails to open
- mikmod: call MikMod_Exit() only in the finish() method
* audio outputs:
diff --git a/src/decoder/ffmpeg_plugin.c b/src/decoder/ffmpeg_plugin.c
index c48918067..aca02cb2a 100644
--- a/src/decoder/ffmpeg_plugin.c
+++ b/src/decoder/ffmpeg_plugin.c
@@ -264,7 +264,7 @@ ffmpeg_decode_internal(struct ffmpeg_context *ctx)
AVPacket packet;
struct audio_format audio_format;
enum decoder_command cmd;
- int current, total_time;
+ int total_time;
total_time = 0;
@@ -306,9 +306,10 @@ ffmpeg_decode_internal(struct ffmpeg_context *ctx)
av_free_packet(&packet);
if (cmd == DECODE_COMMAND_SEEK) {
- current = decoder_seek_where(decoder) * AV_TIME_BASE;
+ int64_t where =
+ decoder_seek_where(decoder) * AV_TIME_BASE;
- if (av_seek_frame(format_context, -1, current, 0) < 0)
+ if (av_seek_frame(format_context, -1, where, 0) < 0)
decoder_seek_error(decoder);
else
decoder_command_finished(decoder);