summaryrefslogtreecommitdiff
path: root/formats
diff options
context:
space:
mode:
authorSean Bright <sean.bright@gmail.com>2017-04-21 13:04:44 -0400
committerSean Bright <sean.bright@gmail.com>2017-04-25 16:24:37 -0500
commit1b50df78d069632e5607e2937461a33d7f568431 (patch)
treee9768588d01be3d2a2c1de11821fe59b138e5000 /formats
parentf7ca69809a0c39be4cf42844c7d7d474e68d8305 (diff)
cleanup: Fix fread() and fwrite() error handling
Cleaned up some of the incorrect uses of fread() and fwrite(), mostly in the format modules. Neither of these functions will ever return a value less than 0, which we were checking for in some cases. I've introduced a fair amount of duplication in the format modules, but I plan to change how format modules work internally in a subsequent patch set, so this is simply a stop-gap. Change-Id: I8ca1cd47c20b2c0b72088bd13b9046f6977aa872
Diffstat (limited to 'formats')
-rw-r--r--formats/format_g719.c12
-rw-r--r--formats/format_g723.c13
-rw-r--r--formats/format_g726.c12
-rw-r--r--formats/format_g729.c12
-rw-r--r--formats/format_gsm.c16
-rw-r--r--formats/format_h263.c16
-rw-r--r--formats/format_h264.c16
-rw-r--r--formats/format_ilbc.c12
-rw-r--r--formats/format_ogg_vorbis.c10
-rw-r--r--formats/format_pcm.c24
-rw-r--r--formats/format_siren14.c12
-rw-r--r--formats/format_siren7.c12
-rw-r--r--formats/format_sln.c14
-rw-r--r--formats/format_vox.c14
-rw-r--r--formats/format_wav.c23
-rw-r--r--formats/format_wav_gsm.c14
16 files changed, 179 insertions, 53 deletions
diff --git a/formats/format_g719.c b/formats/format_g719.c
index f58286290..b93cf0be6 100644
--- a/formats/format_g719.c
+++ b/formats/format_g719.c
@@ -47,8 +47,16 @@ static struct ast_frame *g719read(struct ast_filestream *s, int *whennext)
AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, BUF_SIZE);
if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != s->fr.datalen) {
- if (res)
- ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno));
+ if (feof(s->f)) {
+ if (res) {
+ ast_log(LOG_WARNING, "Incomplete frame data at end of %s file "
+ "(expected %d bytes, read %d)\n",
+ ast_format_get_name(s->fr.subclass.format), s->fr.datalen, res);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Error while reading %s file: %s\n",
+ ast_format_get_name(s->fr.subclass.format), strerror(errno));
+ }
return NULL;
}
*whennext = s->fr.samples = BYTES_TO_SAMPLES(res);
diff --git a/formats/format_g723.c b/formats/format_g723.c
index 926c65b74..5eed3f5c8 100644
--- a/formats/format_g723.c
+++ b/formats/format_g723.c
@@ -66,8 +66,17 @@ static struct ast_frame *g723_read(struct ast_filestream *s, int *whennext)
}
/* Read the data into the buffer */
AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, size);
- if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != size) {
- ast_log(LOG_WARNING, "Short read (%d of %d bytes) (%s)!\n", res, size, strerror(errno));
+ if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != s->fr.datalen) {
+ if (feof(s->f)) {
+ if (res) {
+ ast_log(LOG_WARNING, "Incomplete frame data at end of %s file "
+ "(expected %d bytes, read %d)\n",
+ ast_format_get_name(s->fr.subclass.format), s->fr.datalen, res);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Error while reading %s file: %s\n",
+ ast_format_get_name(s->fr.subclass.format), strerror(errno));
+ }
return NULL;
}
*whennext = s->fr.samples = 240;
diff --git a/formats/format_g726.c b/formats/format_g726.c
index cadb2d96a..0455d6dff 100644
--- a/formats/format_g726.c
+++ b/formats/format_g726.c
@@ -126,8 +126,16 @@ static struct ast_frame *g726_read(struct ast_filestream *s, int *whennext)
AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, frame_size[fs->rate]);
s->fr.samples = 8 * FRAME_TIME;
if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != s->fr.datalen) {
- if (res)
- ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno));
+ if (feof(s->f)) {
+ if (res) {
+ ast_log(LOG_WARNING, "Incomplete frame data at end of %s file "
+ "(expected %d bytes, read %d)\n",
+ ast_format_get_name(s->fr.subclass.format), s->fr.datalen, res);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Error while reading %s file: %s\n",
+ ast_format_get_name(s->fr.subclass.format), strerror(errno));
+ }
return NULL;
}
*whennext = s->fr.samples;
diff --git a/formats/format_g729.c b/formats/format_g729.c
index 413354626..fa122d33b 100644
--- a/formats/format_g729.c
+++ b/formats/format_g729.c
@@ -53,8 +53,16 @@ static struct ast_frame *g729_read(struct ast_filestream *s, int *whennext)
s->fr.samples = G729A_SAMPLES;
AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, BUF_SIZE);
if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != s->fr.datalen) {
- if (res && (res != 10)) /* XXX what for ? */
- ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno));
+ if (feof(s->f)) {
+ if (res) {
+ ast_log(LOG_WARNING, "Incomplete frame data at end of %s file "
+ "(expected %d bytes, read %d)\n",
+ ast_format_get_name(s->fr.subclass.format), s->fr.datalen, res);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Error while reading %s file: %s\n",
+ ast_format_get_name(s->fr.subclass.format), strerror(errno));
+ }
return NULL;
}
*whennext = s->fr.samples;
diff --git a/formats/format_gsm.c b/formats/format_gsm.c
index 54c4b8ffa..07aba9f19 100644
--- a/formats/format_gsm.c
+++ b/formats/format_gsm.c
@@ -57,10 +57,18 @@ static struct ast_frame *gsm_read(struct ast_filestream *s, int *whennext)
{
int res;
- AST_FRAME_SET_BUFFER(&(s->fr), s->buf, AST_FRIENDLY_OFFSET, GSM_FRAME_SIZE)
+ AST_FRAME_SET_BUFFER(&(s->fr), s->buf, AST_FRIENDLY_OFFSET, GSM_FRAME_SIZE);
if ((res = fread(s->fr.data.ptr, 1, GSM_FRAME_SIZE, s->f)) != GSM_FRAME_SIZE) {
- if (res)
- ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno));
+ if (feof(s->f)) {
+ if (res) {
+ ast_log(LOG_WARNING, "Incomplete frame data at end of %s file "
+ "(expected %d bytes, read %d)\n",
+ ast_format_get_name(s->fr.subclass.format), GSM_FRAME_SIZE, res);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Error while reading %s file: %s\n",
+ ast_format_get_name(s->fr.subclass.format), strerror(errno));
+ }
return NULL;
}
*whennext = s->fr.samples = GSM_SAMPLES;
@@ -133,7 +141,7 @@ static int gsm_seek(struct ast_filestream *fs, off_t sample_offset, int whence)
int i;
fseeko(fs->f, 0, SEEK_END);
for (i=0; i< (offset - max) / GSM_FRAME_SIZE; i++) {
- if (!fwrite(gsm_silence, 1, GSM_FRAME_SIZE, fs->f)) {
+ if (fwrite(gsm_silence, 1, GSM_FRAME_SIZE, fs->f) != GSM_FRAME_SIZE) {
ast_log(LOG_WARNING, "fwrite() failed: %s\n", strerror(errno));
}
}
diff --git a/formats/format_h263.c b/formats/format_h263.c
index 67f126927..5c23923b7 100644
--- a/formats/format_h263.c
+++ b/formats/format_h263.c
@@ -60,7 +60,7 @@ static int h263_open(struct ast_filestream *s)
{
unsigned int ts;
- if (fread(&ts, 1, sizeof(ts), s->f) < sizeof(ts)) {
+ if (fread(&ts, 1, sizeof(ts), s->f) != sizeof(ts)) {
ast_log(LOG_WARNING, "Empty file!\n");
return -1;
}
@@ -76,7 +76,7 @@ static struct ast_frame *h263_read(struct ast_filestream *s, int *whennext)
struct h263_desc *fs = (struct h263_desc *)s->_private;
/* Send a frame from the file to the appropriate channel */
- if ((res = fread(&len, 1, sizeof(len), s->f)) < 1)
+ if ((res = fread(&len, 1, sizeof(len), s->f)) != sizeof(len))
return NULL;
len = ntohs(len);
mark = (len & FRAME_ENDED) ? 1 : 0;
@@ -87,8 +87,16 @@ static struct ast_frame *h263_read(struct ast_filestream *s, int *whennext)
}
AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, len);
if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != s->fr.datalen) {
- if (res)
- ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno));
+ if (feof(s->f)) {
+ if (res) {
+ ast_log(LOG_WARNING, "Incomplete frame data at end of %s file "
+ "(expected %d bytes, read %d)\n",
+ ast_format_get_name(s->fr.subclass.format), s->fr.datalen, res);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Error while reading %s file: %s\n",
+ ast_format_get_name(s->fr.subclass.format), strerror(errno));
+ }
return NULL;
}
s->fr.samples = fs->lastts; /* XXX what ? */
diff --git a/formats/format_h264.c b/formats/format_h264.c
index 2ce7a593d..5051fd450 100644
--- a/formats/format_h264.c
+++ b/formats/format_h264.c
@@ -52,7 +52,7 @@ struct h264_desc {
static int h264_open(struct ast_filestream *s)
{
unsigned int ts;
- if (fread(&ts, 1, sizeof(ts), s->f) < sizeof(ts)) {
+ if (fread(&ts, 1, sizeof(ts), s->f) != sizeof(ts)) {
ast_log(LOG_WARNING, "Empty file!\n");
return -1;
}
@@ -68,7 +68,7 @@ static struct ast_frame *h264_read(struct ast_filestream *s, int *whennext)
struct h264_desc *fs = (struct h264_desc *)s->_private;
/* Send a frame from the file to the appropriate channel */
- if ((res = fread(&len, 1, sizeof(len), s->f)) < 1)
+ if ((res = fread(&len, 1, sizeof(len), s->f)) != sizeof(len))
return NULL;
len = ntohs(len);
mark = (len & FRAME_ENDED) ? 1 : 0;
@@ -79,8 +79,16 @@ static struct ast_frame *h264_read(struct ast_filestream *s, int *whennext)
}
AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, len);
if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != s->fr.datalen) {
- if (res)
- ast_log(LOG_WARNING, "Short read (%d of %d) (%s)!\n", res, len, strerror(errno));
+ if (feof(s->f)) {
+ if (res) {
+ ast_log(LOG_WARNING, "Incomplete frame data at end of %s file "
+ "(expected %d bytes, read %d)\n",
+ ast_format_get_name(s->fr.subclass.format), s->fr.datalen, res);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Error while reading %s file: %s\n",
+ ast_format_get_name(s->fr.subclass.format), strerror(errno));
+ }
return NULL;
}
s->fr.samples = fs->lastts;
diff --git a/formats/format_ilbc.c b/formats/format_ilbc.c
index 0e2a92d14..2d67ab244 100644
--- a/formats/format_ilbc.c
+++ b/formats/format_ilbc.c
@@ -51,8 +51,16 @@ static struct ast_frame *ilbc_read(struct ast_filestream *s, int *whennext)
/* Send a frame from the file to the appropriate channel */
AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, ILBC_BUF_SIZE);
if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != s->fr.datalen) {
- if (res)
- ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno));
+ if (feof(s->f)) {
+ if (res) {
+ ast_log(LOG_WARNING, "Incomplete frame data at end of %s file "
+ "(expected %d bytes, read %d)\n",
+ ast_format_get_name(s->fr.subclass.format), s->fr.datalen, res);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Error while reading %s file: %s\n",
+ ast_format_get_name(s->fr.subclass.format), strerror(errno));
+ }
return NULL;
}
*whennext = s->fr.samples = ILBC_SAMPLES;
diff --git a/formats/format_ogg_vorbis.c b/formats/format_ogg_vorbis.c
index cf3b1c0e9..a7a9447e7 100644
--- a/formats/format_ogg_vorbis.c
+++ b/formats/format_ogg_vorbis.c
@@ -183,10 +183,10 @@ static int ogg_vorbis_rewrite(struct ast_filestream *s,
while (!tmp->eos) {
if (ogg_stream_flush(&tmp->os, &tmp->og) == 0)
break;
- if (!fwrite(tmp->og.header, 1, tmp->og.header_len, s->f)) {
+ if (fwrite(tmp->og.header, 1, tmp->og.header_len, s->f) != tmp->og.header_len) {
ast_log(LOG_WARNING, "fwrite() failed: %s\n", strerror(errno));
}
- if (!fwrite(tmp->og.body, 1, tmp->og.body_len, s->f)) {
+ if (fwrite(tmp->og.body, 1, tmp->og.body_len, s->f) != tmp->og.body_len) {
ast_log(LOG_WARNING, "fwrite() failed: %s\n", strerror(errno));
}
if (ogg_page_eos(&tmp->og))
@@ -213,10 +213,10 @@ static void write_stream(struct ogg_vorbis_desc *s, FILE *f)
if (ogg_stream_pageout(&s->os, &s->og) == 0) {
break;
}
- if (!fwrite(s->og.header, 1, s->og.header_len, f)) {
- ast_log(LOG_WARNING, "fwrite() failed: %s\n", strerror(errno));
+ if (fwrite(s->og.header, 1, s->og.header_len, f) != s->og.header_len) {
+ ast_log(LOG_WARNING, "fwrite() failed: %s\n", strerror(errno));
}
- if (!fwrite(s->og.body, 1, s->og.body_len, f)) {
+ if (fwrite(s->og.body, 1, s->og.body_len, f) != s->og.body_len) {
ast_log(LOG_WARNING, "fwrite() failed: %s\n", strerror(errno));
}
if (ogg_page_eos(&s->og)) {
diff --git a/formats/format_pcm.c b/formats/format_pcm.c
index 05a7eabc5..cc32ca12f 100644
--- a/formats/format_pcm.c
+++ b/formats/format_pcm.c
@@ -85,9 +85,17 @@ static struct ast_frame *pcm_read(struct ast_filestream *s, int *whennext)
/* Send a frame from the file to the appropriate channel */
AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, BUF_SIZE);
- if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) < 1) {
- if (res)
- ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno));
+ if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != s->fr.datalen) {
+ if (feof(s->f)) {
+ if (res) {
+ ast_log(LOG_WARNING, "Incomplete frame data at end of %s file "
+ "(expected %d bytes, read %d)\n",
+ ast_format_get_name(s->fr.subclass.format), s->fr.datalen, res);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Error while reading %s file: %s\n",
+ ast_format_get_name(s->fr.subclass.format), strerror(errno));
+ }
return NULL;
}
s->fr.datalen = res;
@@ -142,9 +150,10 @@ static int pcm_seek(struct ast_filestream *fs, off_t sample_offset, int whence)
const char *src = (ast_format_cmp(fs->fmt->format, ast_format_alaw) == AST_FORMAT_CMP_EQUAL) ? alaw_silence : ulaw_silence;
while (left) {
- size_t written = fwrite(src, 1, (left > BUF_SIZE) ? BUF_SIZE : left, fs->f);
- if (written == -1)
+ size_t written = fwrite(src, 1, MIN(left, BUF_SIZE), fs->f);
+ if (written < MIN(left, BUF_SIZE)) {
break; /* error */
+ }
left -= written;
}
ret = 0; /* successful */
@@ -212,7 +221,10 @@ static int pcm_write(struct ast_filestream *fs, struct ast_frame *f)
to_write = fpos - cur;
if (to_write > sizeof(buf))
to_write = sizeof(buf);
- fwrite(buf, 1, to_write, fs->f);
+ if (fwrite(buf, 1, to_write, fs->f) != to_write) {
+ ast_log(LOG_ERROR, "Failed to write to file: %s\n", strerror(errno));
+ return -1;
+ }
cur += to_write;
}
}
diff --git a/formats/format_siren14.c b/formats/format_siren14.c
index d0a16c4a2..b35ebce14 100644
--- a/formats/format_siren14.c
+++ b/formats/format_siren14.c
@@ -47,8 +47,16 @@ static struct ast_frame *siren14read(struct ast_filestream *s, int *whennext)
AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, BUF_SIZE);
if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != s->fr.datalen) {
- if (res)
- ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno));
+ if (feof(s->f)) {
+ if (res) {
+ ast_log(LOG_WARNING, "Incomplete frame data at end of %s file "
+ "(expected %d bytes, read %d)\n",
+ ast_format_get_name(s->fr.subclass.format), s->fr.datalen, res);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Error while reading %s file: %s\n",
+ ast_format_get_name(s->fr.subclass.format), strerror(errno));
+ }
return NULL;
}
*whennext = s->fr.samples = BYTES_TO_SAMPLES(res);
diff --git a/formats/format_siren7.c b/formats/format_siren7.c
index acfde420c..c7856b2a7 100644
--- a/formats/format_siren7.c
+++ b/formats/format_siren7.c
@@ -47,8 +47,16 @@ static struct ast_frame *siren7read(struct ast_filestream *s, int *whennext)
AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, BUF_SIZE);
if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != s->fr.datalen) {
- if (res)
- ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno));
+ if (feof(s->f)) {
+ if (res) {
+ ast_log(LOG_WARNING, "Incomplete frame data at end of %s file "
+ "(expected %d bytes, read %d)\n",
+ ast_format_get_name(s->fr.subclass.format), s->fr.datalen, res);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Error while reading %s file: %s\n",
+ ast_format_get_name(s->fr.subclass.format), strerror(errno));
+ }
return NULL;
}
*whennext = s->fr.samples = BYTES_TO_SAMPLES(res);
diff --git a/formats/format_sln.c b/formats/format_sln.c
index 67e5cd5ed..aa47bde56 100644
--- a/formats/format_sln.c
+++ b/formats/format_sln.c
@@ -40,9 +40,17 @@ static struct ast_frame *generic_read(struct ast_filestream *s, int *whennext, u
/* Send a frame from the file to the appropriate channel */
AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, buf_size);
- if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) < 1) {
- if (res)
- ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno));
+ if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != s->fr.datalen) {
+ if (feof(s->f)) {
+ if (res) {
+ ast_log(LOG_WARNING, "Incomplete frame data at end of %s file "
+ "(expected %d bytes, read %d)\n",
+ ast_format_get_name(s->fr.subclass.format), s->fr.datalen, res);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Error while reading %s file: %s\n",
+ ast_format_get_name(s->fr.subclass.format), strerror(errno));
+ }
return NULL;
}
*whennext = s->fr.samples = res/2;
diff --git a/formats/format_vox.c b/formats/format_vox.c
index 6cef72dfa..e4d1e378b 100644
--- a/formats/format_vox.c
+++ b/formats/format_vox.c
@@ -46,9 +46,17 @@ static struct ast_frame *vox_read(struct ast_filestream *s, int *whennext)
/* Send a frame from the file to the appropriate channel */
AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, BUF_SIZE);
- if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) < 1) {
- if (res)
- ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno));
+ if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != s->fr.datalen) {
+ if (feof(s->f)) {
+ if (res) {
+ ast_log(LOG_WARNING, "Incomplete frame data at end of %s file "
+ "(expected %d bytes, read %d)\n",
+ ast_format_get_name(s->fr.subclass.format), s->fr.datalen, res);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Error while reading %s file: %s\n",
+ ast_format_get_name(s->fr.subclass.format), strerror(errno));
+ }
return NULL;
}
*whennext = s->fr.samples = res * 2;
diff --git a/formats/format_wav.c b/formats/format_wav.c
index 90095eb35..81807c11a 100644
--- a/formats/format_wav.c
+++ b/formats/format_wav.c
@@ -363,7 +363,7 @@ static void wav_close(struct ast_filestream *s)
/* Pad to even length */
if (fs->bytes & 0x1) {
- if (!fwrite(&zero, 1, 1, s->f)) {
+ if (fwrite(&zero, 1, 1, s->f) != 1) {
ast_log(LOG_WARNING, "fwrite() failed: %s\n", strerror(errno));
}
}
@@ -387,14 +387,23 @@ static struct ast_frame *wav_read(struct ast_filestream *s, int *whennext)
here = ftello(s->f);
if (fs->maxlen - here < bytes) /* truncate if necessary */
bytes = fs->maxlen - here;
- if (bytes < 0)
- bytes = 0;
+ if (bytes <= 0) {
+ return NULL;
+ }
/* ast_debug(1, "here: %d, maxlen: %d, bytes: %d\n", here, s->maxlen, bytes); */
AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, bytes);
-
- if ( (res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) <= 0 ) {
- if (res)
- ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno));
+
+ if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != s->fr.datalen) {
+ if (feof(s->f)) {
+ if (res) {
+ ast_log(LOG_WARNING, "Incomplete frame data at end of %s file "
+ "(expected %d bytes, read %d)\n",
+ ast_format_get_name(s->fr.subclass.format), s->fr.datalen, res);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Error while reading %s file: %s\n",
+ ast_format_get_name(s->fr.subclass.format), strerror(errno));
+ }
return NULL;
}
s->fr.datalen = res;
diff --git a/formats/format_wav_gsm.c b/formats/format_wav_gsm.c
index 5b3853ef7..f11b27277 100644
--- a/formats/format_wav_gsm.c
+++ b/formats/format_wav_gsm.c
@@ -424,8 +424,16 @@ static struct ast_frame *wav_read(struct ast_filestream *s, int *whennext)
int res;
if ((res = fread(msdata, 1, MSGSM_FRAME_SIZE, s->f)) != MSGSM_FRAME_SIZE) {
- if (res && (res != 1))
- ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", res, strerror(errno));
+ if (feof(s->f)) {
+ if (res) {
+ ast_log(LOG_WARNING, "Incomplete frame data at end of %s file "
+ "(expected %d bytes, read %d)\n",
+ ast_format_get_name(s->fr.subclass.format), MSGSM_FRAME_SIZE, res);
+ }
+ } else {
+ ast_log(LOG_ERROR, "Error while reading %s file: %s\n",
+ ast_format_get_name(s->fr.subclass.format), strerror(errno));
+ }
return NULL;
}
/* Convert from MS format to two real GSM frames */
@@ -513,7 +521,7 @@ static int wav_seek(struct ast_filestream *fs, off_t sample_offset, int whence)
int i;
fseek(fs->f, 0, SEEK_END);
for (i=0; i< (offset - max) / MSGSM_FRAME_SIZE; i++) {
- if (!fwrite(msgsm_silence, 1, MSGSM_FRAME_SIZE, fs->f)) {
+ if (fwrite(msgsm_silence, 1, MSGSM_FRAME_SIZE, fs->f) != MSGSM_FRAME_SIZE) {
ast_log(LOG_WARNING, "fwrite() failed: %s\n", strerror(errno));
}
}