diff options
author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-08-21 08:32:01 +0000 |
---|---|---|
committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-08-21 08:32:01 +0000 |
commit | 9bae83f89fa644d1572d2ce7dfd67170bf6ce3c2 (patch) | |
tree | 5d1241d47dce6737fa551a795d1d4bf565ad657a /addr2line.c | |
parent | 4259d2358860aefb7b2ef0c970ffbe41a168420b (diff) |
* addr2line.c (fill_lines): need check and cast of the file size of
target binary because there are some platforms which off_t > size_t.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36755 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'addr2line.c')
-rw-r--r-- | addr2line.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/addr2line.c b/addr2line.c index 2b0bb90616..b8d103eb7b 100644 --- a/addr2line.c +++ b/addr2line.c @@ -1,6 +1,6 @@ /********************************************************************** - addr2line.h - + addr2line.c - $Author$ @@ -458,9 +458,14 @@ fill_lines(int num_traces, void **traces, char **syms, int check_debuglink, fprintf(stderr, "lseek: %s\n", strerror(e)); return; } + if (filesize > SIZE_MAX) { + close(fd); + fprintf(stderr, "Too large file %s\n", binary_filename); + return; + } lseek(fd, 0, SEEK_SET); /* async-signal unsafe */ - file = (char *)mmap(NULL, filesize, PROT_READ, MAP_SHARED, fd, 0); + file = (char *)mmap(NULL, (size_t)filesize, PROT_READ, MAP_SHARED, fd, 0); if (file == MAP_FAILED) { int e = errno; close(fd); @@ -470,7 +475,7 @@ fill_lines(int num_traces, void **traces, char **syms, int check_debuglink, current_line->fd = fd; current_line->mapped = file; - current_line->mapped_size = filesize; + current_line->mapped_size = (size_t)filesize; for (i = 0; i < num_traces; i++) { const char *path; |