summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Freeman (saurik) <saurik@saurik.com>2017-01-06 18:54:37 -0800
committerJay Freeman (saurik) <saurik@saurik.com>2017-01-06 18:54:37 -0800
commit15764b0b067b99d08b810303c4615fb8ee296887 (patch)
tree3ab418fb2755c1cebfdc42f14101615e8be0d410
parentcdd9c0fdae31bc0f7b12884cce015b79e817367d (diff)
downloadldid-15764b0b067b99d08b810303c4615fb8ee296887.tar.gz
ldid-15764b0b067b99d08b810303c4615fb8ee296887.tar.zst
ldid-15764b0b067b99d08b810303c4615fb8ee296887.zip
Avoid blowing up the stack hashing large binaries.
-rw-r--r--ldid.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/ldid.cpp b/ldid.cpp
index d7fdf7a..fa21a15 100644
--- a/ldid.cpp
+++ b/ldid.cpp
@@ -1381,6 +1381,11 @@ class NullBuffer :
}
};
+class Digest {
+ public:
+ uint8_t sha1_[LDID_SHA1_DIGEST_LENGTH];
+};
+
class Hash {
public:
char sha1_[LDID_SHA1_DIGEST_LENGTH];
@@ -1652,14 +1657,14 @@ std::vector<char> Sign(const void *idata, size_t isize, std::streambuf &output,
if (!team.empty())
put(data, team.c_str(), team.size() + 1);
- uint8_t storage[special + normal][LDID_SHA1_DIGEST_LENGTH];
- uint8_t (*hashes)[LDID_SHA1_DIGEST_LENGTH] = storage + special;
+ std::vector<Digest> storage(special + normal);
+ auto *hashes(&storage[special]);
- memset(storage, 0, sizeof(*storage) * special);
+ memset(storage.data(), 0, sizeof(Digest) * special);
_foreach (blob, blobs) {
auto local(reinterpret_cast<const Blob *>(&blob.second[0]));
- sha1((uint8_t *) (hashes - blob.first), local, Swap(local->length));
+ sha1((hashes - blob.first)->sha1_, local, Swap(local->length));
}
_foreach (slot, posts) {
@@ -1669,11 +1674,11 @@ std::vector<char> Sign(const void *idata, size_t isize, std::streambuf &output,
if (normal != 1)
for (size_t i = 0; i != normal - 1; ++i)
- sha1(hashes[i], (PageSize_ * i < overlap.size() ? overlap.data() : top) + PageSize_ * i, PageSize_);
+ sha1(hashes[i].sha1_, (PageSize_ * i < overlap.size() ? overlap.data() : top) + PageSize_ * i, PageSize_);
if (normal != 0)
- sha1(hashes[normal - 1], top + PageSize_ * (normal - 1), ((limit - 1) % PageSize_) + 1);
+ sha1(hashes[normal - 1].sha1_, top + PageSize_ * (normal - 1), ((limit - 1) % PageSize_) + 1);
- put(data, storage, sizeof(storage));
+ put(data, storage.data(), sizeof(Digest) * storage.size());
const auto &save(insert(blobs, CSSLOT_CODEDIRECTORY, CSMAGIC_CODEDIRECTORY, data));
sha1(hash, save.data(), save.size());