mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-02 10:22:46 +00:00
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
This commit is contained in:
@@ -120,10 +120,12 @@ static int mp3_squeue(struct ast_filestream *s)
|
||||
|
||||
res = ftell(s->f);
|
||||
p->sbuflen = fread(p->sbuf, 1, MP3_SCACHE, s->f);
|
||||
if(p->sbuflen < 0) {
|
||||
ast_log(LOG_WARNING, "Short read (%d) (%s)!\n", p->sbuflen, strerror(errno));
|
||||
if (p->sbuflen < MP3_SCACHE) {
|
||||
if (ferror(s->f)) {
|
||||
ast_log(LOG_WARNING, "Error while reading MP3 file: %s\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
res = decodeMP3(&p->mp,p->sbuf,p->sbuflen,p->dbuf,MP3_DCACHE,&p->dbuflen);
|
||||
if(res != MP3_OK)
|
||||
return -1;
|
||||
|
@@ -856,13 +856,13 @@ static int b64_inbuf(struct b64_baseio *bio, FILE *fi)
|
||||
if (bio->ateof)
|
||||
return 0;
|
||||
|
||||
if ((l = fread(bio->iobuf, 1, B64_BASEMAXINLINE,fi)) <= 0) {
|
||||
if (ferror(fi))
|
||||
return -1;
|
||||
|
||||
if ((l = fread(bio->iobuf, 1, B64_BASEMAXINLINE, fi)) != B64_BASEMAXINLINE) {
|
||||
bio->ateof = 1;
|
||||
if (l == 0) {
|
||||
/* Assume EOF */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
bio->iolen = l;
|
||||
bio->iocp = 0;
|
||||
|
@@ -2730,9 +2730,9 @@ static int imap_store_file(const char *dir, const char *mailboxuser, const char
|
||||
*(vmu->email) = '\0';
|
||||
return -1;
|
||||
}
|
||||
if (fread(buf, len, 1, p) < len) {
|
||||
if (fread(buf, 1, len, p) != len) {
|
||||
if (ferror(p)) {
|
||||
ast_log(LOG_ERROR, "Short read while reading in mail file.\n");
|
||||
ast_log(LOG_ERROR, "Error while reading mail file: %s\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -4745,13 +4745,13 @@ static int inbuf(struct baseio *bio, FILE *fi)
|
||||
if (bio->ateof)
|
||||
return 0;
|
||||
|
||||
if ((l = fread(bio->iobuf, 1, BASEMAXINLINE, fi)) <= 0) {
|
||||
if (ferror(fi))
|
||||
return -1;
|
||||
|
||||
if ((l = fread(bio->iobuf, 1, BASEMAXINLINE, fi)) != BASEMAXINLINE) {
|
||||
bio->ateof = 1;
|
||||
if (l == 0) {
|
||||
/* Assume EOF */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
bio->iolen = l;
|
||||
bio->iocp = 0;
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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));
|
||||
}
|
||||
}
|
||||
|
@@ -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 ? */
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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)) {
|
||||
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)) {
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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));
|
||||
}
|
||||
}
|
||||
|
23
main/http.c
23
main/http.c
@@ -526,6 +526,10 @@ void ast_http_send(struct ast_tcptls_session_instance *ser,
|
||||
/* send content */
|
||||
if (method != AST_HTTP_HEAD || status_code >= 400) {
|
||||
if (out && ast_str_strlen(out)) {
|
||||
/*
|
||||
* NOTE: Because ser->f is a non-standard FILE *, fwrite() will probably not
|
||||
* behave exactly as documented.
|
||||
*/
|
||||
if (fwrite(ast_str_buffer(out), ast_str_strlen(out), 1, ser->f) != 1) {
|
||||
ast_log(LOG_ERROR, "fwrite() failed: %s\n", strerror(errno));
|
||||
close_connection = 1;
|
||||
@@ -537,6 +541,10 @@ void ast_http_send(struct ast_tcptls_session_instance *ser,
|
||||
int len;
|
||||
|
||||
while ((len = read(fd, buf, sizeof(buf))) > 0) {
|
||||
/*
|
||||
* NOTE: Because ser->f is a non-standard FILE *, fwrite() will probably not
|
||||
* behave exactly as documented.
|
||||
*/
|
||||
if (fwrite(buf, len, 1, ser->f) != 1) {
|
||||
ast_log(LOG_WARNING, "fwrite() failed: %s\n", strerror(errno));
|
||||
close_connection = 1;
|
||||
@@ -923,6 +931,11 @@ static int http_body_read_contents(struct ast_tcptls_session_instance *ser, char
|
||||
{
|
||||
int res;
|
||||
|
||||
/*
|
||||
* NOTE: Because ser->f is a non-standard FILE *, fread() does not behave as
|
||||
* documented.
|
||||
*/
|
||||
|
||||
/* Stay in fread until get all the expected data or timeout. */
|
||||
res = fread(buf, length, 1, ser->f);
|
||||
if (res < 1) {
|
||||
@@ -950,6 +963,11 @@ static int http_body_discard_contents(struct ast_tcptls_session_instance *ser, i
|
||||
int res;
|
||||
char buf[MAX_HTTP_LINE_LENGTH];/* Discard buffer */
|
||||
|
||||
/*
|
||||
* NOTE: Because ser->f is a non-standard FILE *, fread() does not behave as
|
||||
* documented.
|
||||
*/
|
||||
|
||||
/* Stay in fread until get all the expected data or timeout. */
|
||||
while (sizeof(buf) < length) {
|
||||
res = fread(buf, sizeof(buf), 1, ser->f);
|
||||
@@ -1066,6 +1084,11 @@ static int http_body_check_chunk_sync(struct ast_tcptls_session_instance *ser)
|
||||
int res;
|
||||
char chunk_sync[2];
|
||||
|
||||
/*
|
||||
* NOTE: Because ser->f is a non-standard FILE *, fread() does not behave as
|
||||
* documented.
|
||||
*/
|
||||
|
||||
/* Stay in fread until get the expected CRLF or timeout. */
|
||||
res = fread(chunk_sync, sizeof(chunk_sync), 1, ser->f);
|
||||
if (res < 1) {
|
||||
|
@@ -6458,6 +6458,12 @@ static int get_input(struct mansession *s, char *output)
|
||||
}
|
||||
|
||||
ao2_lock(s->session);
|
||||
/*
|
||||
* It is worth noting here that you can all but ignore fread()'s documentation
|
||||
* for the purposes of this call. The FILE * we are working with here was created
|
||||
* as a result of a call to fopencookie() (or equivalent) in tcptls.c, and as such
|
||||
* the behavior of fread() is not as documented. Frankly, I think this is gross.
|
||||
*/
|
||||
res = fread(src + s->session->inlen, 1, maxlen - s->session->inlen, s->session->f);
|
||||
if (res < 1) {
|
||||
res = -1; /* error return */
|
||||
|
Reference in New Issue
Block a user