diff options
| author | Chandler Carruth <chandlerc@gmail.com> | 2015-03-10 07:53:02 +0000 |
|---|---|---|
| committer | Chandler Carruth <chandlerc@gmail.com> | 2015-03-10 07:53:02 +0000 |
| commit | b952e2287bfc86509746373593ad350c39a1c45c (patch) | |
| tree | 5ef2142672344fa39733aa9de88c8305fccbb285 /lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp | |
| parent | 17f5dbef9bf15af43c93fe0662051cb24d4ae4f9 (diff) | |
| download | bcm5719-llvm-b952e2287bfc86509746373593ad350c39a1c45c.tar.gz bcm5719-llvm-b952e2287bfc86509746373593ad350c39a1c45c.zip | |
Fix a bug where the code would use subscript a std::vector with the size
of the vector. For a vector 'v', '&v[v.size()]' isn't a valid way to
compute a pointer one-past-the-end of the vector. Instead, write the
loop in terms of iterators and save the beginning iterator. Once we have
that we can compute the beginning pointer from the beginning iterator,
and compute the distance which we should increment the beginning pointer
by subtracting the iterators.
What might be simpler would be to convert the function accepting a raw
pointer for begin and end to accept iterators or a range or some other
construct, but I wanted to keep this to a minimal bug-fix change.
This fixes a crash on any debug STL implementation which checks for
indexing out of bounds.
llvm-svn: 231765
Diffstat (limited to 'lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp')
| -rw-r--r-- | lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp index 6b1f5130ddb..6fa5280df6c 100644 --- a/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp +++ b/lld/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp @@ -970,13 +970,14 @@ BaseRelocChunk::createContents(ChunkVectorT &chunks) const { // Base relocations for the same memory page are grouped together // and passed to createBaseRelocBlock. - for (size_t i = 0, e = relocSites.size(); i < e;) { - const BaseReloc *begin = &relocSites[i]; - uint64_t pageAddr = (begin->addr & ~mask); - for (++i; i < e; ++i) - if ((relocSites[i].addr & ~mask) != pageAddr) + for (auto it = relocSites.begin(), e = relocSites.end(); it != e;) { + auto begin_it = it; + uint64_t pageAddr = (begin_it->addr & ~mask); + for (++it; it != e; ++it) + if ((it->addr & ~mask) != pageAddr) break; - const BaseReloc *end = &relocSites[i]; + const BaseReloc *begin = &*begin_it; + const BaseReloc *end = begin + (it - begin_it); std::vector<uint8_t> block = createBaseRelocBlock(pageAddr, begin, end); contents.insert(contents.end(), block.begin(), block.end()); } |

