Do proper bounds checking in formats (bug #1356)
authorMark Spencer <markster@digium.com>
Thu, 15 Apr 2004 16:02:42 +0000 (16:02 +0000)
committerMark Spencer <markster@digium.com>
Thu, 15 Apr 2004 16:02:42 +0000 (16:02 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@2694 65c4cc65-6c06-0410-ace0-fbb531ad65f3

formats/format_g729.c
formats/format_gsm.c
formats/format_pcm.c
formats/format_pcm_alaw.c
formats/format_wav.c
formats/format_wav_gsm.c

index 746c40b..68dde21 100755 (executable)
@@ -183,8 +183,9 @@ static int g729_seek(struct ast_filestream *fs, long sample_offset, int whence)
                offset = max - bytes;
        if (whence != SEEK_FORCECUR) {
                offset = (offset > max)?max:offset;
-               offset = (offset < min)?min:offset;
        }
+       // protect against seeking beyond begining.
+       offset = (offset < min)?min:offset;
        if (lseek(fs->fd, offset, SEEK_SET) < 0)
                return -1;
        return 0;
index 4ac2b5a..d58039e 100755 (executable)
@@ -197,9 +197,10 @@ static int gsm_seek(struct ast_filestream *fs, long sample_offset, int whence)
                offset = distance + cur;
        else if(whence == SEEK_END)
                offset = max - distance;
+       // Always protect against seeking past the begining.
+       offset = (offset < min)?min:offset;
        if (whence != SEEK_FORCECUR) {
                offset = (offset > max)?max:offset;
-               offset = (offset < min)?min:offset;
        } else if (offset > max) {
                int i;
                lseek(fs->fd, 0, SEEK_END);
index a175f40..bc54899 100755 (executable)
@@ -172,8 +172,9 @@ static int pcm_seek(struct ast_filestream *fs, long sample_offset, int whence)
                offset = max - sample_offset;
        if (whence != SEEK_FORCECUR) {
                offset = (offset > max)?max:offset;
-               offset = (offset < min)?min:offset;
        }
+       // always protect against seeking past begining.
+       offset = (offset < min)?min:offset;
        return lseek(fs->fd, offset, SEEK_SET);
 }
 
index 6210306..db6b0c3 100755 (executable)
@@ -253,8 +253,9 @@ static int pcm_seek(struct ast_filestream *fs, long sample_offset, int whence)
                offset = max - sample_offset;
        if (whence != SEEK_FORCECUR) {
                offset = (offset > max)?max:offset;
-               offset = (offset < min)?min:offset;
        }
+       // Always protect against seeking past begining
+       offset = (offset < min)?min:offset;
        return lseek(fs->fd, offset, SEEK_SET);
 }
 
index dbca8ed..52f1508 100755 (executable)
@@ -525,8 +525,9 @@ static int wav_seek(struct ast_filestream *fs, long sample_offset, int whence)
                offset = max - samples;
         if (whence != SEEK_FORCECUR) {
                offset = (offset > max)?max:offset;
-               offset = (offset < min)?min:offset;
        }
+       // always protect the header space.
+       offset = (offset < min)?min:offset;
        return lseek(fs->fd,offset,SEEK_SET);
 }
 
index 1d33caf..6c988bd 100755 (executable)
@@ -493,8 +493,9 @@ static int wav_seek(struct ast_filestream *fs, long sample_offset, int whence)
                offset = distance + cur;
        else if(whence == SEEK_END)
                offset = max - distance;
+       // always protect against seeking past end of header
+       offset = (offset < min)?min:offset;
        if (whence != SEEK_FORCECUR) {
-               offset = (offset < min)?min:offset;
                offset = (offset > max)?max:offset;
        } else if (offset > max) {
                int i;