summaryrefslogtreecommitdiff
path: root/apps/app_voicemail.c
diff options
context:
space:
mode:
authorMatthew Jordan <mjordan@digium.com>2012-04-16 21:42:12 +0000
committerMatthew Jordan <mjordan@digium.com>2012-04-16 21:42:12 +0000
commitebcccf8997764b3aa84d36112ae8380703e1d053 (patch)
treebc8ff4550fa13b18f61bcf93f5f86246800fabcb /apps/app_voicemail.c
parentabf40d9b28c0fc8339643e2903692e154d32719e (diff)
Fix handling of negative return code when storing voicemails in ODBC storage
When storing a voicemail message using an ODBC connection to a database, the voicemail message is first stored on disk. The sound file associated with the message is read into memory before being transmitted to the database. When this occurs, a failure in the C library's lseek function would cause a negative value to be passed to the mmap as the size of the memory map to create. This would almost certainly cause the creation of the memory map to fail, resulting in the message being lost. (issue ASTERISK-19655) Reported by: Matt Jordan Review: https://reviewboard.asterisk.org/r/1863 ........ Merged revisions 362201 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 362202 from http://svn.asterisk.org/svn/asterisk/branches/10 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@362203 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'apps/app_voicemail.c')
-rw-r--r--apps/app_voicemail.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 990999751..0f9cad5d8 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -3883,7 +3883,7 @@ static int store_file(const char *dir, const char *mailboxuser, const char *mail
int res = 0;
int fd = -1;
void *fdm = MAP_FAILED;
- size_t fdlen = -1;
+ off_t fdlen = -1;
SQLHSTMT stmt;
char sql[PATH_MAX];
char msgnums[20];
@@ -3948,11 +3948,14 @@ static int store_file(const char *dir, const char *mailboxuser, const char *mail
}
}
fdlen = lseek(fd, 0, SEEK_END);
- lseek(fd, 0, SEEK_SET);
- printf("Length is %zd\n", fdlen);
+ if (fdlen < 0 || lseek(fd, 0, SEEK_SET) < 0) {
+ ast_log(AST_LOG_WARNING, "Failed to process sound file '%s': %s\n", full_fn, strerror(errno));
+ res = -1;
+ break;
+ }
fdm = mmap(NULL, fdlen, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (fdm == MAP_FAILED) {
- ast_log(AST_LOG_WARNING, "Memory map failed!\n");
+ ast_log(AST_LOG_WARNING, "Memory map failed for sound file '%s'!\n", full_fn);
res = -1;
break;
}
@@ -4194,8 +4197,7 @@ static int copy(char *infile, char *outfile)
close(ifd);
close(ofd);
unlink(outfile);
- }
- if (len) {
+ } else if (len) {
res = write(ofd, buf, len);
if (errno == ENOMEM || errno == ENOSPC || res != len) {
ast_log(AST_LOG_WARNING, "Write failed on %s (%d of %d): %s\n", outfile, res, len, strerror(errno));