[asterisk-commits] mjordan: branch 1.8 r362201 - /branches/1.8/apps/app_voicemail.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Apr 16 16:37:24 CDT 2012
Author: mjordan
Date: Mon Apr 16 16:37:20 2012
New Revision: 362201
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=362201
Log:
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
Modified:
branches/1.8/apps/app_voicemail.c
Modified: branches/1.8/apps/app_voicemail.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/apps/app_voicemail.c?view=diff&rev=362201&r1=362200&r2=362201
==============================================================================
--- branches/1.8/apps/app_voicemail.c (original)
+++ branches/1.8/apps/app_voicemail.c Mon Apr 16 16:37:20 2012
@@ -3791,7 +3791,7 @@
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];
@@ -3856,11 +3856,14 @@
}
}
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;
}
@@ -4102,8 +4105,7 @@
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));
More information about the asterisk-commits
mailing list