summaryrefslogtreecommitdiff
path: root/libs/libsndfile/src/sndfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'libs/libsndfile/src/sndfile.c')
-rw-r--r--libs/libsndfile/src/sndfile.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/libs/libsndfile/src/sndfile.c b/libs/libsndfile/src/sndfile.c
index c30d7b61b4..b627c88ffe 100644
--- a/libs/libsndfile/src/sndfile.c
+++ b/libs/libsndfile/src/sndfile.c
@@ -1150,7 +1150,7 @@ sf_seek (SNDFILE *sndfile, sf_count_t offset, int whence)
** it makes sense.
*/
if (((whence & SFM_MASK) == SFM_WRITE && psf->mode == SFM_READ) ||
- ((whence & SFM_MASK) == SFM_WRITE && psf->mode == SFM_WRITE))
+ ((whence & SFM_MASK) == SFM_READ && psf->mode == SFM_WRITE))
{ psf->error = SFE_WRONG_SEEK ;
return PSF_SEEK_ERROR ;
} ;
@@ -1210,10 +1210,25 @@ sf_seek (SNDFILE *sndfile, sf_count_t offset, int whence)
if (psf->error)
return PSF_SEEK_ERROR ;
+#ifdef ECDL_ORIGINAL#
if (seek_from_start < 0 || seek_from_start > psf->sf.frames)
{ psf->error = SFE_BAD_SEEK ;
return PSF_SEEK_ERROR ;
} ;
+#else
+ if (((whence & SFM_MASK) == SFM_WRITE) || (psf->mode == SFM_WRITE || psf->mode == SFM_RDWR))
+ { if (seek_from_start < 0 /* || (seek_from_start > psf->sf.frames && post-audio chunks exist) */ )
+ { psf->error = SFE_BAD_SEEK ;
+ return PSF_SEEK_ERROR ;
+ }
+ }
+ else /* seek for reading */
+ { if (seek_from_start < 0 || seek_from_start > psf->sf.frames)
+ { psf->error = SFE_BAD_SEEK ;
+ return PSF_SEEK_ERROR ;
+ }
+ }
+#endif
if (psf->seek)
{ int new_mode = (whence & SFM_MASK) ? (whence & SFM_MASK) : psf->mode ;
@@ -1234,6 +1249,7 @@ sf_seek (SNDFILE *sndfile, sf_count_t offset, int whence)
break ;
} ;
+
psf->last_op = new_mode ;
return retval ;